解讀Spark Streaming RDD的全生命周期


本節主要內容:

一、DStream與RDD關系的徹底的研究

二、StreamingRDD的生成徹底研究

Spark Streaming RDD思考三個關鍵的問題:

RDD本身是基本對象,根據一定時間定時產生RDD的對象,隨着時間的積累,不對其管理的話會導致內存會溢出,所以在BatchDuration時間內執行完RDD操作后,需對RDD進行管理。

1、DStream生成RDD的過程,DStream到底是怎么生成RDD的?

2、DStream和RDD到底什么關系?

3、運行之后怎么對RDD處理?

 

所以研究Spark Streaming的RDD,RDD產生的全生命周期,產生、運行、運行后的管理尤其重要。

源碼解讀:

溫馨提示:廣播和計數器並不像看上去簡單,在實際的最佳實踐中,通過廣播和計數器可以實現非常復雜的算法。

看代碼邏輯,邏輯是一種想法,上述代碼的socketTextStream,就可以想象數據的輸入?,數據處理?數據怎么來?

在獲得數據后進行一系列的transformations、最后進行foreachRDD的操作。

1、直接用foreachRDD 在這里面直接定義了對action操作,可以直接寫對RDD處理的操作函數,如圖:

 

2、從RDD的角度講,操作DStream 的print函數,其實是轉過來操作foreachRDD的print:

在RDD中操作action不會產生新的RDD,DStream和它完全對應,在DStream中操作action不會產生新的DStream。

foreachDStream是transformation操作,在整個Spark Streaming的操作中,foreachDStream不一定會觸發job的執行

,但會觸發Job的產生。

Job產生由timer產生,根據業務邏輯代碼產生,和foreachDStream沒什么關系。

1、foreachDStream和Job的執行沒有關系,不會觸發Job執行。

2、有foreachDStream執行會產生Job是不對的,只根據框架來調度Job的執行。

foreachRDD的代碼中對RDD的操作,如果沒有action操作則不會執行action的操作。

foreachRDD是Spark Streaming的后門,直接對rdd的操作,背后封裝成foreachRDD的操作。

總結:

在Spark Streaming的所有邏輯操作都是對DStream的操作,對DStream的操作其實就是對RDD的操作,DStream是RDD的模板。

后面的DStream對前面的DStream有依賴:

 

對map操作產生map的DStream:

 

基於DStream怎么產生rdd?通過batchInterval。研究DStream是怎么生成,看DStream的操作觸發RDD的生成。

根據時間實例產生RDDs,和batchDuration對齊的,如:timer實例就是1秒,1秒生成一個RDD

每個RDD對應一個Job,因為RDD就是DStream操作的時間間隔的最后一個RDD,后面的RDD對前面

的RDD有依賴關系,后面對前面有依賴可以推到出整個依賴鏈條。

看下官方:

計算從后往前推,計算只需要獲取最后一個的RDD的句柄。根據時間從后往前找出

RDD的依賴關系,從而找出對應的空間關系。

看下generateRDD是怎么獲取的?

 

后的rdd和batchDuration對應的rdd,DStream有個getOrComputer方法,根據batchDuration生成rdd的,可以是

緩存或計算級別算出來。

到此處,RDD變量生成了,但是並沒有執行,只是在邏輯級別的代碼,可以在框架級別進行優化管理。

注意:SparkStreaming實際上在沒有輸入數據的時候仍然會產生RDD,可以在此處修改源碼,提升性能。

新浪微博:http://weibo.com/ilovepains

微信公眾號:DT_Spark

博客:http://blog.sina.com.cn/ilovepains

手機:18610086859

QQ:1740415547

郵箱:18610086859@vip.126.com

Spark發行筆記8

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM