Spark DAG之SubmitStage

概要

介紹提交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方法,查看該方法
這裏寫圖片描述
該方法非常簡單,職責如下

  1. 拷貝集合waitingStages到waitingStagesCopy,清空waitingStages。
  2. 遍歷waitingStagesCopy中的Stage,調用submitStage方法。

submitStage的流程上面剛介紹過,submitWaitingStages的流程如下
這裏寫圖片描述

submitWaitingStages的作用

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

總結

圍繞submitStagesubmitWaitingStages方法,通過流程圖,介紹如何提交Stage,大致如下

  1. 調用submitStage提交Stage。
  2. DAGScheduler處理定義的各種事件都會調用一次submitWaitingStages方法,submitWaitingStages繼續調用submitStage提交處於waiting狀態的Stage,直至所有Stage執行完畢。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章