本節主要內容:
一、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