<a href="http://s1.51cto.com/wyfs02/M02/9E/6E/wKiom1mRDpnjonstAAS9PfMCTqo980.jpg-wh_651x-s_1178740078.jpg" target="_blank"></a>
概覽
Spark Streaming是Spark API的一個可橫向擴容,高吞吐量,容錯的實時資料流處理引擎,Spark能夠從Kafka、Flume、Kinesis或者TCP等等輸入擷取資料,然後能夠使用複雜的計算表達式如map,reduce,join和window對資料進行計算。計算完後的資料能夠被推送到檔案系統,資料庫,和實時的儀表盤。另外,你也可以使用Spark ML和圖計算處理實時資料流。
<a href="http://s3.51cto.com/wyfs02/M02/9E/5C/wKioL1mRDqyAFPQEAADMV58sDAg529.jpg" target="_blank"></a>
Spark Streaming接受到了實時資料後,把它們分批進行切割,然後再交給Spark進行資料的批量處理。
<a href="http://s3.51cto.com/wyfs02/M00/9E/5C/wKioL1mRDrngZnmiAACHVzeOqdQ405.jpg" target="_blank"></a>
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
本文作者:小埋醬
來源:51CTO