Spark入門:Spark Streaming 概覽
概覽
Spark Streaming是Spark API的一個可橫向擴容,高吞吐量,容錯的實時數據流處理引擎,Spark能夠從Kafka、Flume、Kinesis或者TCP等等輸入獲取數據,然后能夠使用復雜的計算表達式如map,reduce,join和window對數據進行計算。計算完后的數據能夠被推送到文件系統,數據庫,和實時的儀表盤。另外,你也可以使用Spark ML和圖計算處理實時數據流。
Spark Streaming接受到了實時數據后,把它們分批進行切割,然后再交給Spark進行數據的批量處理。
Spark Streaming對離散化的數據流提供了高級別的抽象DStream,所有進入的數據流都會被處理為DStreams,在內部,DStream是一個順序排列的RDD。
快速起步
***個實例是如何從TCP輸入中計算單詞出現的次數
首先,我們創建一個JavaStreamingContext對象,它是所有Streaming函數的主入口,再創建一個帶有2個線程的StreamingContext對象,每1秒進行一次批處理。
- import org.apache.spark.*;
- import org.apache.spark.api.java.function.*;
- import org.apache.spark.streaming.*;
- import org.apache.spark.streaming.api.java.*;
- import scala.Tuple2;
- SparkConf conf = new SparkConf().setMaster("local[2]").setAppName("NetworkWordCount");
- JavaStreamingContext jssc = new JavaStreamingContext(conf, Durations.seconds(1));
創建一個偵聽本地9999的TCP數據源
- JavaReceiverInputDStream<String> lines = jssc.socketTextStream("localhost", 9999);
我們把接受到的數據按照空格進行切割
- JavaDStream<String> words = lines.flatMap(x -> Arrays.asList(x.split(" ")).iterator());
對單詞進行統計
- JavaPairDStream<String, Integer> pairs = words.mapToPair(s -> new Tuple2<>(s, 1));
- JavaPairDStream<String, Integer> wordCounts = pairs.reduceByKey((i1, i2) -> i1 + i2);
- wordCounts.print();
把字符串拍扁->映射->進行去重統計,***調用print函數把數據打印到控制臺中
- jssc.start(); // Start the computation
- jssc.awaitTermination(); // Wait for the computation to terminate
***,啟動整個計算過程
為了完成這次實驗,還需要使用nc作為Server進行配合
- nc -lk 9999
Spark提供了示例,可以使用 ./bin/run-example streaming.JavaNetworkWordCount localhost 9999 來體驗WordCount