Spark定製班第6課:Spark Streaming源碼解讀之Job動態生成和深度思考



Spark Streaming Job動態生成三大核心

  • JobGenerator:負責Job生成
  • JobSheduler:負責Job調度
  • ReceiverTracker:獲取元數據

JobGenerator在構造的時候有一個核心的參數是jobScheduler,jobScheduler是整個Job(作業)的生成和提交給集羣的核心,JobGenerator會基於DStream生成Job。這裏面的Job就相當於Java中線程要處理的Runnable裏面的業務邏輯封裝。Spark的Job就是運行的一個作業。

最後來思考一個問題:DStreamGraph將邏輯級別的輸入數據翻譯成物理級別的RDD Graph,最後一個操作是RDD的action操作,是否會立即觸發Job?

  • action觸發Job,這個時候作爲Runnable接口封裝,他會定義一個方法,這個方法裏面是基於DStream的依賴關係生成的RDD。翻譯的時候是將DStream的依賴關係翻譯成RDD的依賴關係,由於DStream的依賴關係最後一個是action級別的,翻譯成RDD的時候,RDD的最後一 個操作也應該是action級別的,如果翻譯的時候直接執行的話,就直接生成了Job,就沒有所謂的隊列,所以會將翻譯的事件放到一個函數中或者一個方法fun() 中,因此,如果這個函數沒有指定的action觸發Job是執行不了的。
  • Spark Streaming根據時間不斷的去管理我們的生成的Job,所以這個時候我們每個Job又有action級別的操作,這個action操作是對DStream進行邏輯級別的操作,他生成每個Job放到隊列的時候,他一定會被翻譯爲RDD的操作,那基於RDD操作的最後一個一定是action級別的,如果翻譯的話直接就是觸發action的話整個Spark Streaming的Job就不受管理了。因此我們既要保證他的翻譯,又要保證對他的管理,把DStream之間的依賴關係轉變爲RDD之間的依賴關係, 最後一個DStream使得action的操作,翻譯成一個RDD之間的action操作,整個翻譯後的內容他是一塊內容,他這一塊內容是放在一個函數體中的,這個函數體,他有函數的定義,這個函數由於只是定義還沒有執行,所以他裏面的RDD的action不會執行,不會觸發Job,當我們的 JobScheduler要調度Job的時候,轉過來在線程池中拿出一條線程執行剛纔的封裝的方法。

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