(七)Spark源码理解之TaskScheduler----part5

来源:互联网 发布:mac flamingo 火鹤 编辑:程序博客网 时间:2024/06/03 19:55

3.4 SchedulerBackend的不同实现方式

Spark的部署模式不同决定了其资源管理方法也会有所不同,即SchedulerBackend也会有不同的实现方式,首先介绍SchedulerBackend的两种主要的实现方式或者说子类。

3.4.1 LocalBackend

LocalBackend属于本地模式下的调度后台支撑服务,所谓本地模式我理解为只有一个executor,executor下有多个线程来运行多个任务,LocalBackend有几个比较重要的方法:

start():TaskSchedulerImpl调用start后触发了LocalBackend调用start函数,该方法产生了一个本地消息传递机制localActor,这个消息传递机制是建立在LocalActor类的基础上的,即localActor发送消息给LocalActor对象,LocalActor对象的receive方法判断接收的消息类型,根据不同的消息类型做出相应的回应,通过它LocalBackend可以处理不同的事件;

reviveOffers():重写了父类SchedulerBackend的reviveOffers()方法,它实质上就是触发localActor发送ReviveOffers消息,LocalActor对象收到该消息后进行处理,首先生成该executor的WorkerOffer(资源表),之后通过TaskSchedulerImpl的resourceOffers方法分配任务给该executor,最后调用executor类的launchTask方法装载任务。

此外还有statusUpdate,killTask等方法,在此就不一一介绍了,基本上与reviveOffers方法的形式类似,都是通过localActor发送消息之后进行处理完成的。

3.4.2 SparkDeploySchedulerBackend

SparkDeploySchedulerBackend继承自CoarseGrainedSchedulerBackend,它的许多功能实现都是依靠CoarseGrainedSchedulerBackend完成的,因此在讲述SparkDeploySchedulerBackend之前可以对CoarseGrainedSchedulerBackend做一个简单的了解,CoarseGrainedSchedulerBackend使用了Akka消息传递机制,有点类似于上述的LocalBackend,它们都使用了消息传递机制,看来Akka确实“强大”。

CoarseGrainedSchedulerBackend有一个比较重要的类或者说消息传递机制—DriverActor,依靠它完成各种操作

DriverActor:有几个重要的变量,如下:

executorActor:HashMap容器,key值为executor的Id,value值为相应的actor引用;

executorAddress:HashMap容器,key值为executor的Id,value值为对应的地址;

executorHost:HashMap容器,key值为executor的Id,value值为相应的host;

freeCores,totalCores:HashMap容器,key值为executor的Id,value值为该executor的空闲的CPU个数,总的CPU个数;

DriverActor类的几个重要的方法也是基于对上述的变量进行操作,如receive方法收到RegisterExecutor(注册executor)消息后对executorHost进行增加操作,方法removeExecutor对executorHost等进行减操作等等。下面讲述其比较重要的几个方法:

receive():主要处理消息传递机制driverActor(driveActor的理解可以参考上述的localActor)传递过来的消息,比如注册executor,状态更新,reviveOffers等等,其实就是对上述提到过的重要变量进行相应的操作;

makeOffers():将executorHost容器中的executor一一生成对应的WorkerOffers序列,该方法在处理reviveOffers消息时被调用,生成WorkerOffers序列之后调用其自身而不是executor类的launchTask方法;

launchTask:主要实现在给executor指定任务后装载相应的任务,若任务的大小超过了一定的限制范围,则装载失败,给出提示消息,否则调用executor类的launchTask装载任务;

此外CoarseGrainedSchedulerBackend中还有一些方法,如:start():它的主要任务即生成一个driverActor变量,或者理解为消息传递机制,removeExecutor方法等等,这些方法就是通过driverActor发送消息之后调用DriverActor对象的相应方法来进行各种事件的处理。

之后我们回到SparkDeploySchedulerBackend,SparkDeploySchedulerBackend继承了上述所提到过的CoarseGrainedSchedulerBackend的各种方法,及其所声明的类(DriverActor),实际上SparkDeploySchedulerBackend能完成各项后台方法主要也就是依靠CoarseGrainedSchedulerBackend的各种方法,因此对于SparkDeploySchedulerBackend的其他方法在此就不做过多的介绍了,只提下在SparkDeploySchedulerBackend调用start方法时生成了AppClient对象,AppClient也是利用消息传递机制来处理各种消息,比如注册应用程序,注册master等等,有关它的具体内容就不多说了。

此外还有MesosSchedulerBackend等等,就不做详细介绍了。

Spark有几种主要的部署模式,分别为locallocal[n]local[*]standaloneSpark自身的资源管理方式),yarn-cluster,yarn-client,mesos,其中locallocal[n]local[*]只会有一个executor,而其余几种模式会有多个从节点(host),从节点会有多个executor,这几种模式的调度器和后台支撑服务(SchedulerBackend)也会有所不同,它们的关系可以描述如下:


尽管yarn模式的调度器有所不同,但最终都会转换为TaskSchedulerImpl,SchedulerBackend都会转换为CoarseGrainedSchedulerBackend,只有mesos有其固有的SchedulerBackend。上述就是SchedulerBackend的相关内容了。。。。

未完待续。。。。
0 0
原创粉丝点击