本文以Hadoop框架为例,介绍了framework与executor向mesos注册过程。
1. Framework注册过程
(1) JobTracker启动时,会调用MesosScheduler的start()方法
(2) MesosScheduler的start()方法创建一个MesosSchedulerDriver对象,并将自己作为参数传入该对象。
(3) MesosSchedulerDriver初始化,创建一个SchedulerProcess对象
(4) MesosSchedulerDriver初始化,调用MasterDetector::create(),它将向SchedulerProcess对象发送一个NewMasterDetectedMessage消息
(5) SchedulerProcess对象收到NewMasterDetectedMessage消息后,向Master发送一个RegisterFrameworkMessage消息
(6) Master收到该消息后,保存相关信息,并返回FrameworkRegistedMessage消息,确认framework注册成功
2. Executor注册过程
本节描述框架frameworkX在某个slaveX上注册executor executorX的过程:
(1)Master***次向slaveX发送执行frameworkX中task的消息 RunTaskMessage
(2)slave收到该消息后,运行相应的消息处理函数runTask()
(3)该函数发现该slave上未启动frameworkX对应的executorX,则调用IsolationModule的lauchExecutor()函数
(4)该函数创建一个FrameworkExecutor对象,并调用ExecutorProcess的Initialize()函数进行初始化,同时启动TaskTracker
(5)Initialize()函数创建消息RegisterExecutorMessage,并发送给slave
(6)Slave收到该消息后,调用对象的消息处理函数registerExecutor,该函数创建ExecutorRegisteredMessage消息,返回给ExecutorProcess
(7)ExecutorProcess收到该消息后,调用对应的消息处理函数registered(),该函数再进一步调用FrameworkExecutor的registered()函数
接下来,master发送给slave的RunTaskMessage消息依次经过的流程如下图所示。需要注意的是,对于同一个计算框 架,Mesos在一个slave上只会创建一个资源container,所有task全部在这个container里运行,也就是说,mesos无法做到 task级别的隔离,只能做到executor级别的隔离,而对于同一个框架,同一个slave上所有task全部在一个executor中运行。
对于Hadoop而言,每个mesos-slave上只会创建一个TaskTracker,且该TaskTracker会被放置到一个 executor(对应一个linux container)中运行,而同一个TaskTracker上所有task均在该TaskTracker所在进程树中,因而共享该executor对应 的资源。当TaskTracker接收到新的task时,会增加该executor可以使用的资源量(使用“lxc-cgroup –n %s %s %lld”),而当有task运行完成时,则减少该executor可使用的资源量(使用“lxc-cgroup –n %s %s %lld”)。
原文链接:http://dongxicheng.org/apache-mesos/apache-mesos-framework-executor-registering/