Spark 解析 : DAGScheduler中的DAG划分与提交

一:Spark 运行架构图片

Spark 解析 : DAGScheduler中的DAG划分与提交_第1张图片

二: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

你可能感兴趣的:(Spark 解析 : DAGScheduler中的DAG划分与提交)