分析源碼步驟:
第一步程序入口:
第二步一直查看runjob方法,可以看出collect()是RDD行動算子,與Job運行提交相關
rdd.scala
sparkcontext.scala
sparkcontext.scala
sparkcontext.scala
第三步runJob()與DAG調度有關
sparkcontext.scala
第四步runJob()核心代碼 - -查看其中提交作業submitJob()的代碼
DAGScheduler.scala
第五步:搜索handleJobSubmitted,handleJobSubmitted中createResultStage()方法會創建ResultStage,即爲最後一個階段finalStage。補充:每一個行動算子都會調用runJob(),最後會new ActiveJob
DAGScheduler.scala
DAGScheduler.scala
DAGScheduler.scala
第六步createResultStage()方法中,先調用getOrCreateParentStages(),獲得或創建父階段,因爲只有父階段先執行完,纔會執行當前的階段。然後再創建ResultStage
DAGScheduler.scala
第七步:核心代碼:進入getOrCreateParentStages(),調用getShuffleDependencies()返回值是HashSet,存放是的依賴關係,再對每一個shuffleDep,調用getOrCreateShuffleMapStage()創建shuffle階段。即一個shuffle依賴就會創建一個shuffle階段
DAGScheduler.scala
DAGScheduler.scala中 getShuffleDependencies此方法是獲取依賴關係
第八步:進入getOrCreateShuffleMapStage(),調用createShuffleMapStage(),創建shuffle階段new ShuffleMapStage
DAGScheduler.scala
DAGScheduler.scala