概要
介紹提交Stage的流程,繼續沿用Spark DAG之劃分Stage中的例子。
前提
上篇博客Spark DAG之劃分Stage介紹了劃分Stage的流程,舉的例子最後生成的Stage如下
劃分Stage階段完成後,DAGScheduler的handleJobSubmitted方法提交Stage,如下
本篇博客重點就是講解上圖中的兩個方法,其中的finalStage變量以第一幅圖爲例。
submitStage
查看submitStage方法
submitStage方法的主要作用如圖中註釋,其涉及到三個重要集合
waitingStages | 等待運行的Stage |
runningStages | 正在運行的Stage |
failedStages | 運行失敗的Stage |
限於篇幅,關於submitStage中的其他方法不再詳解。最後submitStage中的流程大致如下
上面流程圖中父Stage是否執行完畢是如何判斷的?
-
如上圖,調用ShuffleMapStage的isAvailable方法判斷。每當執行完一個Task會對變量_numAvailableOutputs加1,直至所有Task執行完,_numAvailableOutputs等於分區數。
以Spark DAG之劃分Stage中切分的Stage爲例,執行submitStage(finalStage),此時finalStage的值爲ResultStage 4(參考第一幅圖),submitStage方法執行完狀態如下
集合 | 包含的Stage | 狀態 |
runningStages | ShuffleMapStage 0、ShuffleMapStage 2 | 轉爲ShuffleMapTask,發送給Executor執行 |
waitingStages | ShuffleMapStage 1、ShuffleMapStage 3、ResultStage 4 | 等待 |
failedStages | 空 |
submitWaitingStages
submitStage方法執行完畢後調用submitWaitingStages方法,查看該方法
該方法非常簡單,職責如下
- 拷貝集合waitingStages到waitingStagesCopy,清空waitingStages。
- 遍歷waitingStagesCopy中的Stage,調用submitStage方法。
submitStage的流程上面剛介紹過,submitWaitingStages的流程如下
submitWaitingStages的作用
- 結合Spark DAG之劃分Stage的例子,submitStage方法執行後,集合中元素如下
waitingStages | ShuffleMapStage 1、ShuffleMapStage 3、ResultStage 4 |
runningStages | ShuffleMapStage 0、ShuffleMapStage 2 |
- submitWaitingStages方法中調用submitStage依次提交waitingStages的Stage。我們假設執行submitWaitingStages前,ShuffleMapStage 0已執行完畢,ShuffleMapStage 2沒有(其他情況也簡單,不一一列舉),那麼submitWaitingStages方法執行後
waitingStages | ShuffleMapStage 3、ResultStage 4 |
runningStages | ShuffleMapStage 1、ShuffleMapStage 2 |
Completed | ShuffleMapStage 0 |
可以看出調用一次submitWaitingStages方法不能完成所有Stage的提交,需要多次的調用,就是說,提交一個Stage必須其父Stage全部運算完畢。接下來看下哪些事件會觸發submitWaitingStages。
再次觸發submitWaitingStages方法的事件
- Spark DAG之SubmitJob中介紹了DAGSchedulerEvent,具體的事件類型如下,DAGScheduler對所有事件的處理都會再調用一次submitWaitingStages。
JobSubmitted | MapStageSubmitted |
StageCancelled | JobCancelled |
JobGroupCancelled | AllJobsCancelled |
BeginEvent | GettingResultEvent |
CompletionEvent | ExecutorAdded |
ExecutorLost | TaskSetFailed |
ResubmitFailedStages |
總結
圍繞submitStage和submitWaitingStages方法,通過流程圖,介紹如何提交Stage,大致如下
- 調用submitStage提交Stage。
- DAGScheduler處理定義的各種事件都會調用一次submitWaitingStages方法,submitWaitingStages繼續調用submitStage提交處於waiting狀態的Stage,直至所有Stage執行完畢。