IMF傳奇行動第84課:Spark Streaming第三課:StreamingContext、DStream、Receiver深度剖析


本課分成四部分講解:

第一部分對StreamingContext功能及源碼剖析;

第二部分對DStream功能及源碼剖析;

第三部分對Receiver功能及源碼剖析;

最後一部分將StreamingContextDStreamReceiver結合起來分析其流程。


注意:下面的圖中帶分號結尾的是Java代碼,否則是Scala代碼,請諒解。

一、StreamingContext功能及源碼剖析:

1、通過StreamingContext實例對象jssc,創建應用程序主入口,並連上Driver上的接收數據服務端口9999寫入源數據:

2、StreamingContext的主要功能有:

  • 主程序的入口;
  • 提供了各種創建DStream的方法接收各種流入的數據源(例如:KafkaFlumeTwitterZeroMQ和簡單的TCP套接字等);
  • 通過構造函數實例化StreamingContext對象時,可以指定master URLappName、或者傳入SparkConf配置對象、或者已經創建的SparkContext對象;
  • 將接收的數據流傳入DStreams對象中;
  • 通過StreamingContext對象實例的start方法啓動當前應用程序的流計算框架或通過stop方法結束當前應用程序的流計算框架。


二、DStream功能及源碼剖析:

1、DStreamRDD的模板,RDD是抽象的,DStream也是抽象的。

2、DStream的具體實現子類如下圖所示:

3、以StreamingContext實例的socketTextSteam方法爲例,其執行完的結果返回DStream對象實例,其源碼調用過程如下圖:

注意:socket.getInputStream用來獲取數據,while循環用來存儲數據(到內存、磁盤)

三、Receiver功能及源碼剖析:

1、Receiver代表數據的輸入,接收外部輸入的數據,如從Kafka上抓取數據;

2、Receiver運行在Worker節點上;

3、ReceiverWorker節點上抓取Kafka分佈式消息框架上的數據時,具體實現類是KafkaReceiver

4、Receiver是抽象類,其抓取數據的實現子類如下圖所示;

5、如果上述實現類都滿足不了您的要求,您自己可以定義Receiver類,只需要繼承Receiver抽象類來實現自己子類的業務需求。 


四、StreamingContextDStreamReceiver結合流程分析:

1inputStream代表了數據輸入流(如:SocketKafkaFlume)

2Transformation代表了對數據的一系列操作,如flatMapmap

3outputStream代表了數據的輸出,例如wordCount中的println方法

  


數據數據在流進來之後最終會生成Job,最終還是基於Spark CoreRDD進行執行:在處理流進來的數據時是DStream進行Transformation由於是StreamingContext所以根本不會去運行,StreamingContext會根據Transformation生成”DStream的鏈條”及DStreamGraph,而DStreamGraph就是DAG的模板,這個模板是被框架託管的。當我們指定時間間隔的時候,Driver端就會根據這個時間間隔來觸發Job而觸發Job的方法就是根據OutputDStream中指定的具體的function,例如wordcountprint,這個函數一定會傳給ForEachDStream,它會把函數交給最後一個DStream產生的RDD,也就是RDDprint操作,而這個操作就是RDD觸發Action

 

總結:

使用Spark Streaming可以處理各種數據來源類型,如:數據庫、HDFS,服務器log日誌、網絡流,其強大超越了你想象不到的場景,只是很多時候大家不會用,其真正原因是對Sparksparkstreaming本身不瞭解。

 

 

 

 

 

課程筆記來源

DT大數據夢工廠IMF傳奇行動課程學員整理。YY直播永久課堂頻道68917580每晚8點準時開課。

Life is short, you need spark!

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章