Spark的核心就是其调度管理逻辑。其中,处于整个程序运作的枢纽的是作业调度管理。
在这里,我们首先看看DAGScheduler和TaskScheduler各自所负责的功能:DAGScheduler负责将任务拆分成不同阶段具有依赖关系的多批任务,也就是说DAGScheduler实际上是面向stage的调度器,它将任务拆分成不同的stage,我们可以把DAGScheduler看作是负责任务的逻辑调度;而TaskScheduler则是负责每个任务的实际物理调度。TaskScheduler和DAGScheduler通信是通过回调函数来完成的,
首先,我们先列出任务调度涉及的相关概念:
Task:单个分区数据集上的处理流程单元
TaskSet:这是一组彼此之间有关联,但是互相不存在shuffle依赖的任务所组成的任务集
Stage:任务集所对应的调度阶段
Job:由RDD Action产生的多个stage所组成的一次计算操作
Application:由多个作业组成的Spark应用程序
作业调度的顶层逻辑
spark程序实际上是以RDD为基础的计算操作。而这些操作是延迟执行的,这些操作只会生成对应的RDD关系链,只有当需要返回数据或者向外输出数据的操作才会触发实际的计算工作。
作业的提交动作实际上是RDD的相关操作中被隐式调用的,在SparkContext内部通过调用DAGScheduler的作业提交接口来完成作业提交。上面已经讲过,DAGScheduler主要是计算作业和任务的依赖关系,属于任务的逻辑调度。两个主要的接口分别是submitJob和runJob。前者调