簡介
今天了解一下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。