• mesos


    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分配资源等。

    具体如下图所示。

  • 相关阅读:
    Delphi下的WinSock编程
    基于Delphi使用API实现Sock通讯
    delphi7与XE的变量与函数的改变
    Delphi7·ProgressBar控件
    delphi 进度条
    delphi带包编译详解(build with runtime package)
    TList 的 quicksort 算法研究和使用。
    Delphi7升级到Delphi 2010、Delphi XE、Delphi XE2总结
    Delphi编译错误代码翻译表
    Firebird(火鸟)数据库 v3.0.3.32900官方版
  • 原文地址:https://www.cnblogs.com/sdifens/p/11350859.html
Copyright © 2020-2023  润新知