標籤:多個 一個 針對 oid image 流式 orm input 連接埠
Spark Streaming是核心Spark API的擴充,可實現即時資料流的可擴充,高輸送量,容錯流處理。資料可以從許多來源(如Kafka,Flume,Kinesis或TCP通訊端)中擷取,並且可以使用以進階函數表示的複雜演算法進行處理map
,例如reduce
,join
和window
。最後,處理後的資料可以推送到檔案系統,資料庫和即時儀表板
在內部,它的工作原理如下。Spark Streaming接收即時輸入資料流並將資料分成批處理,然後由Spark引擎處理,以批量產生最終結果流
計算流程:Spark Streaming是將流式計算分解成一系列短小的批次工作。這裡的批處理引擎是Spark Core,也就是把Spark Streaming的輸入資料按照batch size(如1秒)分成一段一段的資料(Discretized Stream),每一段資料都轉換成Spark中的RDD(Resilient Distributed Dataset),然後將Spark Streaming中對DStream的Transformation操作變為針對Spark中對RDD的Transformation操作,將RDD經過操作變成中間結果儲存在記憶體中。整個流式計算根據業務的需求可以對中間的結果進行疊加或者儲存到外部裝置
WordCount例子實現(JAVA)
package stuSpark.com;import scala.Tuple2;import org.apache.spark.SparkConf;import org.apache.spark.api.java.function.FlatMapFunction;import org.apache.spark.api.java.function.Function2;import org.apache.spark.api.java.function.PairFunction;import org.apache.spark.streaming.Durations;import org.apache.spark.streaming.api.java.JavaDStream;import org.apache.spark.streaming.api.java.JavaPairDStream;import org.apache.spark.streaming.api.java.JavaReceiverInputDStream;import org.apache.spark.streaming.api.java.JavaStreamingContext;import java.util.Arrays;public class JavaSparkStreaming { public static void main(String[] args){//JavaStreamingContext對象,它是流功能的主要進入點。使用兩個執行線程建立一個本地StreamingContext,批處理間隔為1秒。//SparkStreaming 中local後必須為大於等於2的數字【即至少2條線程】。因為receiver 佔了一個不斷迴圈接收資料SparkConf conf = new SparkConf().setMaster("local[2]").setAppName("NetworkWordCount");JavaStreamingContext jssc = new JavaStreamingContext(conf, Durations.seconds(1));// 建立一個DStream來表示來自TCP源的流資料,指定為主機名稱(例如localhost)和連接埠(例如9999)JavaReceiverInputDStream<String> lines = jssc.socketTextStream("localhost", 9999);//linesDStream表示將從資料服務器接收的資料流。此流中的每條記錄都是一行文本。然後用空格分割為單詞// flatMap是一個DStream操作,通過從源DStream中的每個記錄產生多個新記錄來建立新的DStream。//使用FlatMapFunction對象定義了轉換Java API中有許多這樣的便利類可以協助定義DStream轉換。//DStream是RDD產生的模板,在Spark Streaming發生計算前,其實質是把每個Batch的DStream的操作翻譯成為了RDD操作JavaDStream<String> words = lines.flatMap( new FlatMapFunction<String, String>() { @Override public Iterable<String> call(String x) { return (Iterable<String>) Arrays.asList(x.split(" ")).iterator(); } });//計算JavaPairDStream<String, Integer> pairs = words.mapToPair( new PairFunction<String, String, Integer>() { @Override public Tuple2<String, Integer> call(String s) { return new Tuple2<>(s, 1); } });JavaPairDStream<String, Integer> wordCounts = pairs.reduceByKey( new Function2<Integer, Integer, Integer>() { @Override public Integer call(Integer i1, Integer i2) { return i1 + i2; } });wordCounts.print();//將此DStream 中產生的每個RDD的前十個元素列印到控制台jssc.start(); // 開始jssc.awaitTermination(); // 等待計算終止}}
1.建立StreamingContext對象 同Spark初始化需要建立SparkContext對象一樣,使用Spark Streaming就需要建立StreamingContext對象。建立StreamingContext對象所需的參數與SparkContext基本一致,包括指明Master,設定名稱(如NetworkWordCount)。需要注意的是參數Seconds(1),Spark Streaming需要指定處理資料的時間間隔,如上例所示的1s,那麼Spark Streaming會以1s為時間視窗進行資料處理。此參數需要根據使用者的需求和叢集的處理能力進行適當的設定;
2.建立InputDStream如同Storm的Spout,Spark Streaming需要指明資料來源。如上例所示的socketTextStream,Spark Streaming以socket串連作為資料來源讀取資料。當然Spark Streaming支援多種不同的資料來源,包括Kafka、 Flume、HDFS/S3、Kinesis和Twitter等資料來源;
3.操作DStream對於從資料來源得到的DStream,使用者可以在其基礎上進行各種操作,如上例所示的操作就是一個典型的WordCount執行流程:對於目前時間視窗內從資料來源得到的資料首先進行分割,然後利用Map和ReduceByKey方法進行計算,當然最後還有使用print()方法輸出結果;
4.啟動Spark Streaming之前所作的所有步驟只是建立了執行流程,程式沒有真正串連上資料來源,也沒有對資料進行任何操作,只是設定好了所有的執行計畫,當ssc.start()啟動後程式才真正進行所有預期的操作。
使用Netcat(在大多數類Unix系統中找到的小公用程式)作為資料服務器運行
$ nc -lk 9999
啟動樣本
$ ./bin/run-example streaming.JavaNetworkWordCount localhost 9999
然後,在運行netcat伺服器的終端中鍵入的任何行將被計數並每秒在螢幕上列印
學習隨筆 --SparkStreaming WordCount Java實現