Spark中RDD階段劃分

分析源碼步驟:

第一步程序入口:

 第二步一直查看runjob方法,可以看出collect()是RDD行動算子,與Job運行提交相關

rdd.scala

RDD.scala

 sparkcontext.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

 

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