RDD Stage生成

Stage生成
Stage的調度是由DAGScheduler完成的。由RDD的有向無環圖DAG切分出了Stage的有向無環圖DAG。Stage的DAG通過最後執行的Stage爲根進行廣度優先遍歷,遍歷到最開始執行的Stage執行,如果提交的Stage仍有未完成的父母Stage,則Stage需要等待其父Stage執行完才能執行。同時DAGScheduler中還維持了幾個重要的Key-Value集合結構,用來記錄Stage的狀態,這樣能夠避免過早執行和重複提交Stage。waitingStages中記錄仍有未執行的父母Stage,防止過早執行。runningStages中保存正在執行的Stage,防止重複執行。failedStages中保存執行失敗的Stage,需要重新執行,這裏的設計是出於容錯的考慮。

RDD DAG切分Stage的依據:調度器會計算RDD之間的依賴關係,將擁有持續窄依賴的RDD歸併到同一個Stage中,而寬依賴則作爲劃分不同Stage的判斷標準。

Stage分爲兩種:
ShuffleMapStage, in which case its tasks’ results are input for another stage
其實就是,非最終stage, 後面還有其他的stage, 所以它的輸出一定是需要shuffle並作爲後續的輸入。

這種Stage是以Shuffle爲輸出邊界,其輸入邊界可以是從外部獲取數據,也可以是另一個ShuffleMapStage的輸出
其輸出可以是另一個Stage的開始。
ShuffleMapStage的最後Task就是ShuffleMapTask。
在一個Job裏可能有該類型的Stage,也可以能沒有該類型Stage。

ResultStage, in which case its tasks directly compute the action that initiated a job (e.g. count(), save(), etc)
最終的stage, 沒有輸出, 而是直接產生結果或存儲。

這種Stage是直接輸出結果,其輸入邊界可以是從外部獲取數據,也可以是另一個ShuffleMapStage的輸出。
ResultStage的最後Task就是ResultTask,在一個Job裏必定有該類型Stage。
一個Job含有一個或多個Stage,但至少含有一個ResultStage。

Stage類
stage的RDD參數只有一個RDD, final RDD, 而不是一系列的RDD。
因爲在一個stage中的所有RDD都是map, partition不會有任何改變, 只是在data依次執行不同的map function所以對於TaskScheduler而言, 一個RDD的狀況就可以代表這個stage。

Stage參數說明:
val id: Int //Stage的序號數值越大,優先級越高
val rdd: RDD[], //歸屬於本Stage的最後一個rdd
val numTasks: Int, //創建的Task數目,等於父RDD的輸出Partition數目
val shuffleDep: Option[ShuffleDependency[, , ]], //是否存在SuffleDependency,寬依賴
val parents: List[Stage], //父Stage列表
val jobId: Int //作業ID
發佈了25 篇原創文章 · 獲贊 21 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章