一、调度相关基本概念


Task(任务):单个分区数据集上的最小处理流程单元。

互相之间没有Shuffle依赖关系的任务所组成的任务集。

Stage(调度阶段):一个任务集对应的调度阶段。

Job(作业):由一个RDD Action生成的一个或多个调度阶段所组成的一次计算作业。

Application(应用程序):Spark应用程序,由一个或多个作业组成。


设置spark的执行节点使用cpu核数 spark 定时调度_任务集

二、调度流程图


设置spark的执行节点使用cpu核数 spark 定时调度_数据集_02

三、DAGScheduler

1、构建Stage

当一个RDD操作触发计算,向DAGScheduler提交作业时,DAGScheduler需要从RDD依赖链的末端的RDD出发,遍历整个RDD链,划分调度阶段,调度阶段是以ShuffleDependency为依据的


设置spark的执行节点使用cpu核数 spark 定时调度_数据集_03

2、记录哪个RDD或者Stage输出被物化

通常在一个复杂的shuffle之后,通常物化一下(cache、persist),方便之后的计算

3、重新提交shuffle输出丢失的stage

4、将Taskset传给底层调度器

-spark-cluster :TaskScheduler

-yarn-cluster: YarnClusterScheduler

四、TaskScheduler和TaskSetManager

1、为每一个TaskSet构建一个TaskSetManager实例来管理这个TaskSet的生命周期

2、TaskSetManager会根据(1)上一次任务成功提交的时间 (2)process-local(有缓存cache的节点),node-local,rack-local,any来决定每个Task的最佳位置

TaskScheduler发现某个Task一直未运行完,就可能启动同样的任务运行同一个Task,哪个任务先运行完就用哪个任务的结果

五、二种Task

    shuffleMapTask和ResultTask,被执行的task多数是shuffleMapTask

1、ResultTask (FinalStage 所对应的任务)

返回给driver  的是运算结果本身
<1>
结果足够 小 , 则直接 放在 DirectTaskResult  对 象 内
<2>
超过特定 尺寸 ( 默认约  10MB ) 则在 Executor  端会将DirectTaskResult  先 序 列 化, 再把 序
列 化的结果作为一个 数据块 存放在 BlockManager  里 , 而后将 BlockManager 返回的 BlockID
放在 IndirectTaskResult 对象中返回给 driver

2、shuffleMapTask

返回给DAGScheduler的是一个MapStatus对象,MapStatus对象管理了ShuffleMapTask的运算输出结果在BlockManager里面的相关存储信息,而非结果本身,这些存储信息将作为下一个Stage的任务的获取输入数据的依据