1. 程式人生 > >Spark 解析 : DAGScheduler中的DAG劃分與提交

Spark 解析 : DAGScheduler中的DAG劃分與提交

一:Spark 執行架構圖片

在這裡插入圖片描述

二:Spark 執行架構

各個RDD之間存在著依賴關係,這些依賴關係形成有向無環圖DAG,DAGScheduler對這些依賴關係形成的DAG,進行Stage劃分,劃分的規則很簡單,從後往前回溯,遇到窄依賴加入本stage,遇見寬依賴進行Stage切分。完成了Stage的劃分,DAGScheduler基於每個Stage生成TaskSet,並將TaskSet提交給TaskScheduler。TaskScheduler 負責具體的task排程,在Worker節點上啟動task。

三:解析DAGScheduler中的DAG劃分與提交

1.DAGScheduler的建立
使用者提交編寫的sparkcontext時就建立了DAGScheduler和TaskScheduler。

2.job提交
job產生髮生在RDD執行動作時,這個動作執行方法runjob,來監聽job的執行情況。DAGSheduler通過內部的方法submitJob來提交,但此時的提交只是job最終提交的一小步。此時提交job並生成jobid,將job放入佇列中,由DAGSheduler中的方法來依次處理。最後的提交是送給了DAGScheduler.handleJobSubmitted,這個方法會進行處理job並進行階段劃分。

3.stage劃分
stage的劃分是從最後往前逆推的,依寬依賴作為劃分的準則,遇到寬依賴就劃分出一個stage,遇到窄依賴就壓入棧中。從stage到父stage以及從RDD找出依賴,均是從最後執行動作的RDD,根據依賴資訊往前探尋,為了避免重複訪問或者說重複運算,將訪問過的RDD存入Hashset中。遞迴呼叫方法getparentStage來不斷劃分stage,每次劃分階段都會生成一個stageid,因為遞迴呼叫所以命名的id越往前越小,也就是說從後面先劃分的stageid是最大的,越小的階段之後提交後先被運算。以這樣的步驟劃分階段,直到階段寬依賴劃分完畢或者第一個RDD被訪問完成。

經過以上三個步驟,DAGScheduler將包含一組task的stage提交給TaskScheduler,當然之後還涉及到org.apache.spark.scheduler.SchedulerBackend進行資源分配等。

四:作用

DAGScheduler的job排程的核心入口
*

  • stage劃分演算法非常重要:
  • 必須要對stage演算法很清晰,直到你自己編寫的spark application被劃分為了幾個job,
  • 每個job被劃分為了幾個stage,每個stage包含了你那些程式碼,只有知道了每個stage包括了
  • 你那些程式碼之後,在線上,如果你發現某一個stage執行特別慢,或者是某一個stage一直報錯
  • 你才能針對哪個stage對應的程式碼,去排查問題,或者說是效能調優
  • stage劃分演算法總結:
  • 1、從finalStage倒推
  • 2、通過寬依賴,來進行新的stage的劃分
  • 3、使用遞迴,優先提交父stage