一、调度相关基本概念
Task(任务):单个分区数据集上的最小处理流程单元。
互相之间没有Shuffle依赖关系的任务所组成的任务集。
Stage(调度阶段):一个任务集对应的调度阶段。
Job(作业):由一个RDD Action生成的一个或多个调度阶段所组成的一次计算作业。
Application(应用程序):Spark应用程序,由一个或多个作业组成。
二、调度流程图
三、DAGScheduler
1、构建Stage
当一个RDD操作触发计算,向DAGScheduler提交作业时,DAGScheduler需要从RDD依赖链的末端的RDD出发,遍历整个RDD链,划分调度阶段,调度阶段是以ShuffleDependency为依据的
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的任务的获取输入数据的依据