Spark调度系统——概述

简单来讲,Spark调度系统用于将用户提交的“任务”调度到集群中的不同节点执行。但是Spark实现的调度系统,并非一句话所概括的这么简单。Spark资源调度分为两层:第一层是Cluster Manager(在YARN模式下为ResourceManager,在Mesos模式下为Mesos Master,在Standalone模式下为Master),将资源分配给Application;第二层是Application,进一步将资源分配给Application的各个Task。本文章主要介绍的调度系统只限于第二层。

调度的对象是什么?作业或任务。向Spark提交一个任务,Spark会交其看为一个作业(Job)。Spark首先会对Job进行一系列RDD转换,并通过RDD之间的依赖关系构建有向无环图,然后根据RDD依赖的不同将RDD划分到不同的阶段(Stage),每个阶段按照分区(Partition)的数据创建多个任务(Task),最后将这些任务提交到集群的各个运行节点上运行。

Spark调度系统主要由DAGScheduler和TaskScheduler构成:

其工作流程如下:

  • 1)build operator DAG:用户提交的Job将首先被转换为一系列RDD并通过RDD之间的依赖关系构建DAG,然后将RDD构成的DAG提交到调度系统。
  • 2)split graph into stage of tasks:DAGScheduler负责接收由RDD构成的DAG,将一系列RDD划分到不同的Stage。根据Stage的不同类型(目前有ResultStage和ShuffleMapStage两种),给Stage中未完成的Partition创建不同类型的Task。每个Stage将因为未完成Partition的多少,创建零到多个Task。DAGScheduler最后将每个Stage中的Task以任务集合(TaskSet)的形式提交给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)execute tasks:执行任务,并将任务中间结果和最终结果存入存储体系。

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

 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值