第一部分對StreamingContext功能及源碼剖析;
第二部分對DStream功能及源碼剖析;
第三部分對Receiver功能及源碼剖析;
最後一部分將StreamingContext、DStream、Receiver結合起來分析其流程。
一、StreamingContext功能及源碼剖析:
1、通過StreamingContext實例對象jssc,創建應用程序主入口,並連上Driver上的接收數據服務端口9999寫入源數據:
2、StreamingContext的主要功能有:
-
主程序的入口;
-
提供了各種創建DStream的方法接收各種流入的數據源(例如:Kafka、Flume、Twitter、ZeroMQ和簡單的TCP套接字等);
-
通過構造函數實例化StreamingContext對象時,可以指定master URL、appName、或者傳入SparkConf配置對象、或者已經創建的SparkContext對象;
-
將接收的數據流傳入DStreams對象中;
-
通過StreamingContext對象實例的start方法啓動當前應用程序的流計算框架或通過stop方法結束當前應用程序的流計算框架。
二、DStream功能及源碼剖析:
1、DStream是RDD的模板,RDD是抽象的,DStream也是抽象的。
2、DStream的具體實現子類如下圖所示:
3、以StreamingContext實例的socketTextSteam方法爲例,其執行完的結果返回DStream對象實例,其源碼調用過程如下圖:
注意:socket.getInputStream用來獲取數據,while循環用來存儲數據(到內存、磁盤)。
三、Receiver功能及源碼剖析:
1、Receiver代表數據的輸入,接收外部輸入的數據,如從Kafka上抓取數據;
2、Receiver運行在Worker節點上;
3、Receiver在Worker節點上抓取Kafka分佈式消息框架上的數據時,具體實現類是KafkaReceiver;
4、Receiver是抽象類,其抓取數據的實現子類如下圖所示;
5、如果上述實現類都滿足不了您的要求,您自己可以定義Receiver類,只需要繼承Receiver抽象類來實現自己子類的業務需求。
四、StreamingContext、DStream、Receiver結合流程分析:
(1)inputStream代表了數據輸入流(如:Socket、Kafka、Flume等)
(2)Transformation代表了對數據的一系列操作,如flatMap、map等
(3)outputStream代表了數據的輸出,例如wordCount中的println方法
數據數據在流進來之後最終會生成Job,最終還是基於Spark Core的RDD進行執行:在處理流進來的數據時是DStream進行Transformation由於是StreamingContext所以根本不會去運行,StreamingContext會根據Transformation生成”DStream的鏈條”及DStreamGraph,而DStreamGraph就是DAG的模板,這個模板是被框架託管的。當我們指定時間間隔的時候,Driver端就會根據這個時間間隔來觸發Job而觸發Job的方法就是根據OutputDStream中指定的具體的function,例如wordcount中print,這個函數一定會傳給ForEachDStream,它會把函數交給最後一個DStream產生的RDD,也就是RDD的print操作,而這個操作就是RDD觸發Action。
總結:
使用Spark Streaming可以處理各種數據來源類型,如:數據庫、HDFS,服務器log日誌、網絡流,其強大超越了你想象不到的場景,只是很多時候大家不會用,其真正原因是對Spark、sparkstreaming本身不瞭解。
課程筆記來源:
DT大數據夢工廠IMF傳奇行動課程學員整理。YY直播永久課堂頻道68917580每晚8點準時開課。
Life is short, you need spark!