Spark调度管理【DAGScheduler,TaskScheduler】

本文详细介绍了Spark的DAGScheduler和TaskScheduler的工作原理。DAGScheduler将任务分解为Stage,通过有向无环图确定执行顺序,而TaskScheduler负责将Stage的Task提交到集群执行。在DAGScheduler中,任务提交是根据依赖关系反向递归生成Stage,而对于窄依赖和Shuffle依赖,DAGScheduler分别采取不同的调度策略。
摘要由CSDN通过智能技术生成

一.DAGScheduler

SparkContext在初始化时,创建了DAG调度和Task调度来负责RDD Action操作的调度执行。

DAGScheduler负责Spark的最高级别的任务调度,调度的粒度是Stage,它为每个Job的所有Stage计算一个有向无环图,控制它们的并发,并找到一个最佳路径来执行它们。具体的执行过程是将Stage下的Task任务集提交给TaskScheduler对象,由它来提交到集群上去申请资源并最终完成执行。

DAGScheduler初始化时除了需要一个SparkContext对象外,最重要的是需要输入一个TaskScheduler对象来负责Task的执行。源码如下:
spark2.4.4源码
  1.runJob过程
    所有需要执行的RDD Action,都会调用SparkContext.runJob来提交任务,而SparkContext.runJob调用的是DAGScheduler.runJob。如下:
spark2.4.4源码
   runJob调用submitJob提交任务,并等待任务结束。任务提交后的处理过程如下:

1.submitJob生成新的Job ID,发送消息JobSubmitted。

2.DAG收到JobSubmitted消息,调用handleJobSubmitted来处理。

3.handleJobSubmitted创建一个ResultStage,并使用submitStage来提交这个ResultStage。

上面的过程看起来没执行完,实际上大的过程已经结束了,猫腻在submitStage中。Spark的执行过程是懒加载的,这在这里得到了完整的体现。任务提交时,不是按Job的先后顺序提交的,而是倒序的。每个Job的最后一个操作是Action操作,DAG把这个最后的Action操作当作一个Stage,首先提交,然后逆向逐级递归填补缺少的上级Stage,从而生成一颗实现最后Action操作的最短的【都是必须的】有向无环图,然后再从头开始计算。submitStage方法的实现代码如下:
在这里插入图片描述
    可以看到,这是一个逆向递归的过程,先查找所有缺失的上级Stage并提交,待所有上级Stage都提交执行了,才轮到执行当前Stage对应的Task。查找上级Stage的过程,其实就是递归向上遍历所有RDD依赖列表并生成Stage的过程,代码如下:

 private def 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值