简介
今天了解一下mesos,感觉老外就是牛,什么都想做一个框架出来,写一个分布式软件的难度一下子降低了好多,很多类似软件,都有用mesos重写一番,参见http://mesos.apache.org/documentation/latest/mesos-frameworks/
下面是来自apache官网的简介:
Apache Mesos abstracts CPU, memory, storage, and other compute resources away from machines (physical or virtual), enabling fault-tolerant and elastic distributed systems to easily be built and run effectively.
Mesos is built using the same principles as the Linux kernel, only at a different level of abstraction. The Mesos kernel runs on every machine and provides applications (e.g., Hadoop, Spark, Kafka, Elastic Search) with API’s for resource management and scheduling across entire datacenter and cloud environments.
这里有一句话很有意思,说mesos类似于linux kernel,但是更高层次的抽象。
操作系统有多个组成部分,但进程调度绝对算的上是核心之一。linux进程调度将进程调度到某个核心上(假设是多核cpu),对应的,mesos scheduler组件将task调度到某个slave上,这个更高层次的抽象具体的讲就是:
- linux内核的进程调度器和进程运行在同一个主机上,进程调度器决定将任务队列中的任务分配某个计算单元上(即某个cpu核心)
- 在mesos中,scheduler和其调度的task运行在不同的主机上(mesos屏蔽了分布式系统的通信和容灾等细节),scheduler决定将task部署在某个slave的某个executor上。executor在更高层次抽象了一个完整的计算单元(包含cpu和内存等)
mesos简介
mesos包括以下概念:
- Master daemon
- Slave daemon
- Scheduler
Executor
为task提供上下文环境task
具体的任务,类似hadoop中的map task和reduce task
master daemon和slave daemon很好解释,而对于Scheduler和Executor抽象,我们可以通过其接口来理解,接口包含了一系列回调函数:
public abstract interface org.apache.mesos.Scheduler {
// 向SchedulerDriver注册Scheduler
public abstract void registered(org.apache.mesos.SchedulerDriver arg0, org.apache.mesos.Protos.FrameworkID arg1, org.apache.mesos.Protos.MasterInfo arg2);
// 注册成功后
public abstract void reregistered(org.apache.mesos.SchedulerDriver arg0, org.apache.mesos.Protos.MasterInfo arg1);
// 处理来自各slave的Resource offer,以决定将task分配到哪个slave上
public abstract void resourceOffers(org.apache.mesos.SchedulerDriver arg0, java.util.List arg1);
// resource offer撤回
public abstract void offerRescinded(org.apache.mesos.SchedulerDriver arg0, org.apache.mesos.Protos.OfferID arg1);
// 某个task的状态发生改变
public abstract void statusUpdate(org.apache.mesos.SchedulerDriver arg0, org.apache.mesos.Protos.TaskStatus arg1);
// 收到来自某个Executor的消息
public abstract void frameworkMessage(org.apache.mesos.SchedulerDriver arg0, org.apache.mesos.Protos.ExecutorID arg1, org.apache.mesos.Protos.SlaveID arg2, byte[] arg3);
// "失联"后
public abstract void disconnected(org.apache.mesos.SchedulerDriver arg0);
// 某个slave"失联"后
public abstract void slaveLost(org.apache.mesos.SchedulerDriver arg0, org.apache.mesos.Protos.SlaveID arg1);
// 某个executor"失联"后
public abstract void executorLost(org.apache.mesos.SchedulerDriver arg0, org.apache.mesos.Protos.ExecutorID arg1, org.apache.mesos.Protos.SlaveID arg2, int arg3);
// 运行过程中发生错误时
public abstract void error(org.apache.mesos.SchedulerDriver arg0, java.lang.String arg1);
}
executor
public abstract interface org.apache.mesos.Executor {
// 向ExecutorDriver注册Executor
public abstract void registered(org.apache.mesos.ExecutorDriver arg0, org.apache.mesos.Protos.ExecutorInfo arg1, org.apache.mesos.Protos.FrameworkInfo arg2, org.apache.mesos.Protos.SlaveInfo arg3);
// 估计是注册成功后
public abstract void reregistered(org.apache.mesos.ExecutorDriver arg0, org.apache.mesos.Protos.SlaveInfo arg1);
// “失联”后
public abstract void disconnected(org.apache.mesos.ExecutorDriver arg0);
// 运行任务
public abstract void launchTask(org.apache.mesos.ExecutorDriver arg0, org.apache.mesos.Protos.TaskInfo arg1);
// 收到scheduler杀死task的命令
public abstract void killTask(org.apache.mesos.ExecutorDriver arg0, org.apache.mesos.Protos.TaskID arg1);
// 接受scheduler发送的消息
public abstract void frameworkMessage(org.apache.mesos.ExecutorDriver arg0, byte[] arg1);
// 收到scheduler shutdown的命令
public abstract void shutdown(org.apache.mesos.ExecutorDriver arg0);
// 运行过程中出错
public abstract void error(org.apache.mesos.ExecutorDriver arg0, java.lang.String arg1);
}
言而总之,scheduler和executor提供了一系列回调函数,由scheduler driver和executor driver在合适的时机调用。从这些函数中,我们可以看到,假如我们将Scheduler/Executor(task)作为分布式框架的基本模型,那么mesos封装了大量细节,比如:
- slave信息的汇集
- slave有效性检测
- Scheduler与Executor通信(包括task status汇报等)
从而大大减少我们编写一个分布式任务的复杂性。
简单的例子
本例由Driver、Scheduler和Executor三个类组成
- Driver,类似于hadoop的驱动代码,该类主要完成以下工作:
- Create Executor Info
- Create Framework Info
- Instantiate Scheduler
- Starting the mesos scheduler driver
Scheduler
为每个slave分配一个task,当所有的任务都finished后,停掉Scheduler driver
Executor
执行任务(就是向Scheduler返回一个字符串)
我们通过java -cp xx.jar xx.xx.Driver类
触发Driver执行,Driver触发scheduler driver,scheduler driver执行注册到其上的scheduler。
scheduler运行时,会将ExecutorInfo(参见示例代码)发送到slave daemon,ExecutorInfo包含了executor的启动命令java -cp xx.jar xx
,进而可以触发slave端的executor driver执行executor。