Spark任务调度概述
在Spark中,任务调度是指如何将用户提交的作业(Job)转换为可执行的任务(Task)并分配到集群中的各个节点上进行执行。这个调度过程主要由Driver进行管理,它协调并安排作业的执行,包括构建DAG、划分Task,以及将Task分配给Executor执行。任务调度的关键步骤包括:
- 逻辑DAG产生:将用户的Spark应用程序逻辑(如RDD的转换操作)构建成有向无环图(DAG)。
- 分区DAG产生:根据RDD的分区划分,将逻辑DAG映射到物理分区上。
- Task划分:基于DAG图,进一步划分为独立的任务(Task),每个Task负责处理RDD的一个分区。
- Task调度与监控:将生成的Task分配给集群中的Executor执行,监控其状态和执行结果。
Spark 程序调度工作流程
Spark程序调度的工作流程可以分为两大部分:Driver工作 和 Worker(Executor)工作。
1. Driver的工作:
Driver是Spark应用程序的控制节点,它负责构建和调度任务。Driver的核心工作如下:
-
构建Driver:当用户提交Spark作业时,首先会启动Driver。Driver是负责整体作业调度的主进程。
-
构建SparkContext:SparkContext是与集群交互的接口,负责初始化和管理Spark应用程序的执行环境。
-
DAG Scheduler 构建逻辑Task分配:
- DAG调度器:Driver中的
DAGScheduler
负责将RDD的转换操作组织成DAG(有向无环图),并将该DAG划分为多个Stage。DAG调度器基于RDD的依赖关系(宽依赖和窄依赖)对任务进行划分。 - Stage划分:DAG Scheduler会将宽依赖的操作划分为多个Stage,Stage之间通过shuffle操作连接。
- DAG调度器:Driver中的
构建Task分配用以做任务管理
2. Worker的工作:
Worker节点是Spark集群中的执行节点,负责执行由Driver分配的Task。Worker中的核心是Executor,它负责真正的计算工作。
-
Task Scheduler分配Task到Executor:
- Task调度器:TaskScheduler 是Driver中的另一个组件,它负责将由DAGScheduler产生的Task分配到集群中的各个Executor上执行。它会根据任务的并行度和资源可用性,将Task调度到最合适的Executor上。
- Task执行与监控:TaskScheduler不仅仅负责分配Task,还要监控每个Task的执行状态。如果Task执行失败,TaskScheduler会重新调度该Task在其他节点上运行,保证任务的可靠执行。
-
Worker和Executor执行任务:
- Worker节点启动后,注册到集群管理器(如Standalone, YARN, Mesos),并等待调度器分配Task。
- Executor是由Worker启动的,它们负责接收来自TaskScheduler的Task并在本地执行Task中的计算逻辑。Executor会定期向Driver报告Task的进度和执行结果。
Executor根据Task任务分配的结果去分配
Driver 内的两个核心组件
在Driver中,有两个非常重要的组件来执行调度任务:DAG调度器和Task调度器。它们各司其职,共同协作,完成整个调度流程。
1. DAG 调度器(DAGScheduler):
- 职责:负责将用户的逻辑作业(RDD的转换操作链)转换为DAG,并根据RDD之间的依赖关系(窄依赖与宽依赖)将DAG划分为多个Stage。
- 工作流程:
- 分析RDD之间的依赖关系,将计算流程组织成一个DAG。
- 将宽依赖的RDD操作划分为多个Stage。窄依赖的操作可以在同一个Stage中执行,宽依赖(如
reduceByKey()
等shuffle操作)会触发新的Stage划分。 - 提交各个Stage到TaskScheduler进行进一步处理。
2. Task 调度器(TaskScheduler):
- 职责:负责根据DAGScheduler划分的Stage,将每个Stage中的Task分配到集群中的Executor上执行,并监控Task的执行状态。
- 工作流程:
- 从DAGScheduler接收划分好的Stage和Task。
- 根据集群资源的可用性,将Task分配到合适的Executor节点上执行。
- 监控Task的执行进度,并处理Task失败的情况(重试、重新调度等)。
- 将执行结果反馈给Driver,并在Task全部完成后返回最终结果。
- Driver启动:Spark作业启动后,Driver初始化,并创建SparkContext和调度器组件。
- DAG构建和Stage划分:DAGScheduler分析RDD的依赖关系,构建DAG,并将DAG划分为多个Stage。
- Task划分和分配:TaskScheduler接收由DAGScheduler划分的Stage,将每个Stage进一步拆分为多个Task。TaskScheduler根据集群资源的可用性,将Task分配给Executor执行。
- Task执行:Task在Executor上并行执行,完成计算,并定期向Driver汇报进度。
- 监控与容错:TaskScheduler负责监控Task的执行状态,如果某个Task失败,它会重新调度Task到其他节点执行,保证任务顺利完成。
Spark的任务调度流程主要通过Driver来协调,它负责将用户的逻辑操作转换成DAG,并划分成Stage和Task,然后通过TaskScheduler分配到Executor上执行。调度器包括两个核心组件:DAG调度器负责构建和划分Stage,Task调度器负责将Task调度到集群中的不同节点并监控其执行状态。