菜单
本页目录

Spark任务调度概述

在Spark中,任务调度是指如何将用户提交的作业(Job)转换为可执行的任务(Task)并分配到集群中的各个节点上进行执行。这个调度过程主要由Driver进行管理,它协调并安排作业的执行,包括构建DAG、划分Task,以及将Task分配给Executor执行。任务调度的关键步骤包括:

  1. 逻辑DAG产生:将用户的Spark应用程序逻辑(如RDD的转换操作)构建成有向无环图(DAG)。
  2. 分区DAG产生:根据RDD的分区划分,将逻辑DAG映射到物理分区上。
  3. Task划分:基于DAG图,进一步划分为独立的任务(Task),每个Task负责处理RDD的一个分区。
  4. Task调度与监控:将生成的Task分配给集群中的Executor执行,监控其状态和执行结果。

Spark 程序调度工作流程

Spark程序调度的工作流程可以分为两大部分:Driver工作Worker(Executor)工作

1. Driver的工作

Driver是Spark应用程序的控制节点,它负责构建和调度任务。Driver的核心工作如下:

  1. 构建Driver:当用户提交Spark作业时,首先会启动Driver。Driver是负责整体作业调度的主进程。

  2. 构建SparkContext:SparkContext是与集群交互的接口,负责初始化和管理Spark应用程序的执行环境。

  3. DAG Scheduler 构建逻辑Task分配

    • DAG调度器:Driver中的DAGScheduler负责将RDD的转换操作组织成DAG(有向无环图),并将该DAG划分为多个Stage。DAG调度器基于RDD的依赖关系(宽依赖和窄依赖)对任务进行划分。
    • Stage划分:DAG Scheduler会将宽依赖的操作划分为多个Stage,Stage之间通过shuffle操作连接。

构建Task分配用以做任务管理

2. Worker的工作

Worker节点是Spark集群中的执行节点,负责执行由Driver分配的Task。Worker中的核心是Executor,它负责真正的计算工作。

  1. Task Scheduler分配Task到Executor

    • Task调度器:TaskScheduler 是Driver中的另一个组件,它负责将由DAGScheduler产生的Task分配到集群中的各个Executor上执行。它会根据任务的并行度和资源可用性,将Task调度到最合适的Executor上。
    • Task执行与监控:TaskScheduler不仅仅负责分配Task,还要监控每个Task的执行状态。如果Task执行失败,TaskScheduler会重新调度该Task在其他节点上运行,保证任务的可靠执行。
  2. 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。
  • 工作流程
    1. 分析RDD之间的依赖关系,将计算流程组织成一个DAG。
    2. 将宽依赖的RDD操作划分为多个Stage。窄依赖的操作可以在同一个Stage中执行,宽依赖(如reduceByKey()等shuffle操作)会触发新的Stage划分。
    3. 提交各个Stage到TaskScheduler进行进一步处理。

2. Task 调度器(TaskScheduler)

  • 职责:负责根据DAGScheduler划分的Stage,将每个Stage中的Task分配到集群中的Executor上执行,并监控Task的执行状态。
  • 工作流程
    1. 从DAGScheduler接收划分好的Stage和Task。
    2. 根据集群资源的可用性,将Task分配到合适的Executor节点上执行。
    3. 监控Task的执行进度,并处理Task失败的情况(重试、重新调度等)。
    4. 将执行结果反馈给Driver,并在Task全部完成后返回最终结果。

  1. Driver启动:Spark作业启动后,Driver初始化,并创建SparkContext和调度器组件。
  2. DAG构建和Stage划分:DAGScheduler分析RDD的依赖关系,构建DAG,并将DAG划分为多个Stage。
  3. Task划分和分配:TaskScheduler接收由DAGScheduler划分的Stage,将每个Stage进一步拆分为多个Task。TaskScheduler根据集群资源的可用性,将Task分配给Executor执行。
  4. Task执行:Task在Executor上并行执行,完成计算,并定期向Driver汇报进度。
  5. 监控与容错:TaskScheduler负责监控Task的执行状态,如果某个Task失败,它会重新调度Task到其他节点执行,保证任务顺利完成。

Spark的任务调度流程主要通过Driver来协调,它负责将用户的逻辑操作转换成DAG,并划分成Stage和Task,然后通过TaskScheduler分配到Executor上执行。调度器包括两个核心组件:DAG调度器负责构建和划分Stage,Task调度器负责将Task调度到集群中的不同节点并监控其执行状态。