在上一章中,我们了解了Spark做并行计算的本质其实就是切分多条计算链,且每条计算链作为一个并行任务交付给集群中的核心去并行执行的过程。但是具体到该如何切分,划分之后交付给哪个核心去执行,任务之间的执行顺序如何确定,执行完毕之后的结果该如何汇总,多个应用之间该如何协调等等诸多问题还没有探究,因此本章将会在上一章的基础上,继续深入到Spark底层的调度模块,去理解使Spark程序得以顺利运转的核心机制——调度机制。Spark内部有两套不同的调度机制在工作,分别被应用于集群资源的调度和应用程序内部作业的调度。
集群资源的调度由集群管理器(Cluster Manager)控制,集群管理器负责协调所有的应用程序,为每个Spark应用分配适当的计算资源,Spark目前支持3种集群管理器,分别是YARN、Mesos以及Spark内部自带的Standalone。本书侧重讲解Standalone的调度机制。
后者则是由作业调度器(Job Scheduler)来控制,根据调度过程的先后顺序和调度内容的不同,可把作业调度器再进一步分成DAG调度器(DAG Scheduler)和任务调度器(Task Scheduler)。(www.xing528.com)
DAG即Directed Acyclic Graph,有向无环图的意思,Spark会存储RDD之间的依赖关系,依赖关系是有向的,总是由子RDD指向所依赖的父RDD(平时见到的依赖图,RDD之间的箭头一般是数据流向而不是依赖指向,因此方向刚好相反),RDD依赖的有向性质导致RDD的计算呈现出明显的阶段特征,因此所形成的计算链也可以被分割成多个阶段,后面的阶段依赖于前面的阶段是否已经达成(即RDD内部数据被计算完毕)。由于RDD内部数据不可变,阶段相互之间的依赖关系所形成的有向图自然也不会出现回路,因此可以用DAG来表示阶段的依赖关系。DAG调度器的目的就是把一个作业划分成不同阶段,根据阶段的依赖关系构建一张DAG,并进入到阶段内部,把阶段划分成可以并行计算的并行任务,最后再把一个阶段内的所有任务交付给任务调度器来负责剩下的调度工作。任务调度器接收来自DAG调度器提交的多个任务集,按照Spark配置项里指定的调度算法,来决定任务集,以及任务集内部任务的执行顺序,并把任务交付给CPU核心去执行,每个任务执行完毕之后,会向DAG调度器反映执行情况,当作业内所有的任务执行完毕之后,整个作业即执行成功。
本章会围绕着如上所述的有关集群、DAG以及任务调度模块,介绍Spark的整套调度机制。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。