spark源码阅读7-调度系统1(概述)

    技术2023-11-27  73

    简单来说,Spark调度系统用于将用户提交的“任务”调度到集群中的不同结点执行。但是Spark实现的调度系统,并非一句话所概括的这么简单。Spark的资源调度为两层调度。这里只介绍第二层调度。(第一层调度将在9中介绍)

    调度的对象是什么?作业或者任务。在业务场景中所说的任务与Spark集群中运行的任务在概念上存在很多偏差。人类往往把一件要做的事情认为是任务,因此“向Spark集群提交一个任务”这句话看起来合情合理。工程师向Spark提交一个任务,Spark将其看作一个Job。Spark首先会对Job进行一系列的 RDD转换,并通过RDD之间的依赖关系构建有向无环图DAG)。然后根据RDD依赖的不同将RDD划分到不同的阶段Stage),每个阶段按照分区(patition)的数量创建多个任务(Task)。最后将这些任务提交到集群的各个运行结点上运行。因此Spark中的Task和业务场景中所述的任务是不同的。

    下图描述了调度系统的主要工作流程。

    图7.1 调度系统的主要工作流程

    由上图7.1可知,调度系统主要由DAGScheduler和TaskScheduler构成。调度系统的主要工作流程如下。

    1)build operator DAG:用户提交的Job将首先被转换为一系列RDD并通过RDD之间的依赖关系构建DAG,然后将RDD构成的DAG提交到调度系统。2)划分阶段:DAGScheduler负责接收由RDD构成的DAG,将一系列RDD划分到不同的Stage。根据Stage的不同类型(目前有ResultStage和ShuffleMapStage两种),给Stage中未完成的Patition创建不同的Task(目前有ResultTask和ShuffleMapTask两种)。每个Stage将根据未完成Patition的多少,创建0到多个Task。DAGScheduler最后将每个Stage中的Task以任务集合的形式提交给TaskScheduler继续处理。3)launch tasks via cluster manager:使用集群管理器(cluster manager)分配资源与任务调度,对于失败的任务还会有一定的重试与容错机制。TaskScheduler负责从DAGScheduler接收TaskSet,创建TaskSetManager对TaskSet进行管理,并将此TaskSetManager添加到调度池中,最后将对Task的调度交给调度后端接口(SchedulerBackend)处理。SchedulerBackend首先申请TaskScheduler,按照Task调度算法(FIFO和FAIR两种)对调度池中的所有TaskSetManager进行排序,然后对TaskSet按照最大本地行原则分配资源,最后在各个分配的结点上运行TaskSet中的Task。4)执行任务:执行任务,并将任务中间结果和最终结果存入存储体系。

    以上介绍的4哥步骤中,严格来说只有2,3步属于调度系统的范畴,第1步是将作业提交给调度系统前的准备工作,第4步也和调度系统有很多关系,例如map任务执行成功(reduce任务的上游map全部执行完毕)后唤醒下游的reduce任务。

    Processed: 0.009, SQL: 9