1.1           mesos(分布式资源管理器)

1)   什么是Mesos?

Mesos是一个开源的资源管理系统,可以对集群中的资源做弹性管理。

 

 

Mesos中包含四类主要的服务(实际上是一个socketserver—服务端口),它们分别是Mesos Master,Mesos Slave(从服务),SchedulerProcess(调度进程)和ExecutorProcess(执行进程),它们之间通过Protocal Buffer消息进行通信,每种服务内部注册了若干种Protocal Buffer消息处理器,一旦收到某种消息,则会调用相应的消息处理器进行处理。除了以上四种服务之外,Mesos还对外提供了三种可编程组件,分别是Alloctor(分配器)、Framework Scheduler(框架调度器)和Framework Executor(框架执行器),编写这几个组件必须按照要求实现了几个接口,而这些接口将分别被下图中相邻的服务调用。

大部分人看到以上Mesos架构后,均会认为Framework必须是一个通用的框架,比如MapReduce、Storm、Spark等,而Mesos Master负责将资源分配给各个框架,而各个框架的Scheduler进一步将资源分配给其内部的各个应用程序。这种观念是错误的,是对Mesos架构的一种错误解读。

事实上,Framework不仅可以是通用的框架,也可以是像Hadoop的Job或者YARN的Application那样的简单计算任务,也就是说,Framework并不需要一定是一个“Framework”,或者一个长时间运行的服务(比如JobTracker等),也可以是一个短生命周期的Job或者Application。如果让Framework对应一个Hadoop Job,则可以这样设计Framework Scheduler和Framework Executor:.

(1)Framework Scheduler功能

Framework Scheduler负责按照作业的输入数据量,将之分解成若干任务,并为这些任务申请资源、监控这些任务的运行状态,一旦发现某个任务运行失败则重新为之申请资源。

(2)Framework Executor功能

为一个节点上的Map Task或者Reduce Task准备运行环境,包括准备各种jar包、二进制文件,设置必要的环境变量,进行必要的资源隔离,启动Jetty Shuffle以为Reduce Task提供远程数据拷贝服务等,接收来自Framework Scheduler的命令(启动任务、杀死任务等),并执行。

通过上面的介绍可以知道,Framework Scheduler只负责运行一个Hadoop Job,而如果你对YARN比较熟悉,便会发现者正是YARN中的MapReduce ApplicationMaster做的事情,没错,Mesos与YARN的设计架构如此的相近,以至于我们很容易通过修改YARN 的任何一个ApplicationMaster,让它作为一个Framework Scheduler运行在Mesos中。

最近Mesos提供了一个mesos-submit工具(https://github.com/apache/mesos/blob/trunk/docs/Using-the-mesos-submit-tool.md,注意,该工具尚不完善),该工具可以让用户的Framework Scheduler运行在任何一个Mesos Slave上,以防止客户端运行过多的Framework Scheduler,这样,Mesos的整个架构和工作流程已经变得与YARN相差无几了。

Mesos与yarn区别:

Mesos中的组件

YARN中的组件

功能

Mesos Master

Resource Manager

整个集群的资源管理和调度

Mesos Slave

Node Manager

单个节点的资源管理(资源隔离、汇报等)、任务启动等

Framework Executor

Framework Scheduler

ApplicationMaster

单个应用程序的管理和资源二次调度,基本操作均包括注册、资源申请/获取、资源分配(给内部的任务)等。

2)     Mesos的任务分配过程分析:

 

 

  1. 步骤1 当出现以下几种事件中的一种时,会触发资源分配行为:新框架注册、框架注销、增加节点、出现空闲资源等;
  2. 步骤2 Mesos Master中的Allocator模块为某个框架分配资源,并将资源封装到ResourceOffersMessage(Protocal Buffer Message)中,通过网络传输给SchedulerProcess;
  3. 步骤3 SchedulerProcess调用用户编写的Scheduler中的resourceOffers函数(不能版本可能有变动),告之有新资源可用;
  4. 步骤4 用户的Scheduler调用MesosSchedulerDriver中的launchTasks()函数,告之将要启动的任务;
  5. 步骤5 SchedulerProcess将待启动的任务封装到LaunchTasksMessage(Protocal Buffer Message)中,通过网络传输给Mesos Master;
  6. 步骤6 Mesos Master将待启动的任务封装成RunTaskMessage发送给各个Mesos Slave;
  7. 步骤7 Mesos Slave收到RunTaskMessage消息后,将之进一步发送给对应的ExecutorProcess;
  8. 步骤8 ExecutorProcess收到消息后,进行资源本地化,并准备任务运行环境,最终调用用户编写的Executor中的launchTask启动任务(如果Executor尚未启动,则先要启动Executor)。
3)   在一个Mesos Slave上,一个任务启动过程如下图所示:

 

 

4)   Hadoop框架中framework与executor向mesos注册过程。

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注册成功

 

 

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”)。

5)   Mesos模块间通信架构

对于某个计算框架(如Hadoop,Spark等),如果想接入Mesos,需要编写两个组件,分别是FrameworkSchduler和FrameworkExecutor,这两个组件分别实现Scheduler和Executor接口,并分别通过SchedulerDriver和ExecutorDriver接入Mesos,如图中黑色虚线,表示这几个组件之间通过函数调用产生关系。其他组件,即mesos-master,mesos-save,SchedulerProcess和ExecutorProcess之间则通过消息机制进行通信(使用libprocess开源库)。

(1)【SchedulerProcess与mesos-master】:mesos-master为各个framework分配资源,这些资源直接传递给SchedulerProcess,再由SchedulerProcess调用 FrameworkScheduler的相关函数,由FrameworkScheduler将这些资源分配给框架中的任务,并返回给mesos-master,由mesos-master转发给相应的mesos-slave。

(2)【SchedulerProcess与Mesos-slave】:如果SchedulerProcess中保存了Mesos-slave的地址,则直接将相关消息发送给Mesos-slave,不必再由mesos-master转发。

(3)【Mesos-master与Mesos-slave】:Mesos-master管理mesos-slave,如监控slave的健康状况等

(4)【Mesos-slave与ExecutorProcess】:Mesos-slave负责管理各个framework的executor,并为executor分配资源等。

具体如下图所示。

 

版权声明:本文为sdifens原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/sdifens/p/11350859.html