12.5 Apache Mesos
Mesos[1]是诞生于UC Berkeley的一个研究项目。它的设计动机是解决编程模型和计算框架在多样化环境下,不同框架间的资源隔离和共享问题。尽管它的直接设计动机与MRv 1无关,但它的架构和实现策略与YARN或者Corona类似,因此,本节将对其进行介绍。当前有一些公司正在使用Mesos管理集群资源,比如国外的Twitter、国内的豆瓣[2]等。
12.5.1 Apache Mesos基本框架
如图12-15所示,Apache Mesos由四个组件组成。接下来将详细对这些组件进行介绍。
图 12-15 Mesos的基本架构
(1)Mesos-master
Mesos-master是整个系统的核心,负责管理整个系统中所有资源和接入Mesos的各种计算框架(framework),并将Mesos-slave上的资源按照某种策略分配给框架。为了防止Mesos-master出现故障后导致集群不可用,Mesos允许用户配置多个Mesos-master,并通过Zookeeper进行管理。当主Mesos-master出现故障后,Zookeeper可马上为之选择一个新的主Mesos-master。
(2)Mesos-slave
Mesos-slave负责接收并执行来自Mesos-master的命令,并定时将任务执行状态汇报给Mesos-master。Mesos-slave将节点上资源的使用情况发送给Mesos-master,由Mesos-master中的Allocator模块决定将资源分配给哪个Framework。需要注意的是,当前Mesos仅考虑了CPU和内存两种资源。当用户提交作业时,需要指定每个任务需要的CPU个数和内存量,而当任务运行时,Mesos-slave会将任务运行在包含固定资源的Linux Container中,以达到资源隔离的效果。
(3)Framework-scheduler
Framework是指外部的计算框架,如MPI、MapReduce、Spark等。这些计算框架可通过注册的方式接入Mesos,以便Mesos进行统一管理和资源分配。Mesos要求接入的框架必须有一个调度器模块Framework-scheduler,该调度器负责框架内部的任务调度。一个Framework在Mesos上的工作流程为:首先通过自己的调度器向Mesos注册,并获取Mesos分配给自己的资源,然后由自己的调度器将这些资源分配给框架中的任务。也就是说,整个Mesos系统采用了双层调度框架:第一层,由Mesos将资源分配给框架;第二层,框架自己的调度器将资源分配给内部的各个任务。当前Mesos支持三种语言编写的调度器,分别是C++、Java和Python。为了向各种调度器提供统一的接入方式,Mesos内部采用C++实现了一个MesosSchedulerDriver(调度器驱动器)。Framework的调度器可调用该driver中的接口与Mesos-master交互,完成一系列功能(如注册、资源分配等)。
(4)Framework-Executor
Framework-Executor主要用于启动框架内部的任务。由于不同的框架,启动任务的接口或者方式不同,当一个新的框架要接入Mesos时,需要编写一个对应的Executor,告诉Mesos如何启动该框架中的任务。为了给各种框架提供统一的执行器编写方式,Mesos内部采用C++实现了一个MesosExecutorDriver(执行器驱动器)。Framework可通过该驱动器的相关接口告诉Mesos启动任务的方法。
[1]Mesos:A Platform for Fine-Grained Resource Sharing in the Data Center. B.Hindman, A.Konwinski, M.Zaharia, A.Ghodsi, A.D.Joseph, R.Katz, S.Shenker and I.Stoica, NSDI 2011,March 2011
[2]https://github. com/douban/dpark/