從圖中可以看到,Mesos有Framework(Framework里面有Scheduler), Master(Master里面有allocator), Agent, Executor, Task幾部分組成。這里面有兩層的Scheduler,一層在Master里面,allocator會將資源公平的分給每一個Framework,二層在Framework里面,F(xiàn)ramework的scheduler將資源按規(guī)則分配給Task。
Mesos的這幾個角色在一個任務運行的生命周期中,相互關(guān)系如下:

Agent會將資源匯報給Master,Master會根據(jù)allocator的策略將資源offer給framework的scheduler。Scheduler 可以accept這個資源,運行一個Task,Master將Task交給Agent,Agent交給Executor去真正的運行這個Task。
這個圖相對比較的簡略,真正詳細的過程比這個復雜很多,大家可以參考這篇博客http://www.cnblogs.com/popsuper1982/p/5926724.html ,在代碼級別分析了整個任務運行的過程,還畫了一個泳道圖 http://images2015.cnblogs.com/ ... 9.png 。
要研究Mesos,熟悉整個過程非常重要,這樣一個任務運行出現(xiàn)問題的時候,才能比較好的定位問題在哪里,如果解決。Mesos將一個簡單的任務的運行過程,分成如此多的層次,如此多的角色來做,是為了雙層調(diào)度和靈活配置,這是一個內(nèi)核應該做的事情。
我們?nèi)绾胃深A一個Task的運行過程呢?
第一、寫一個Framework
如果你想完全自己控制Task的運行,而非讓Marathon來運行并保持一個無狀態(tài)的Task長運行,就需要自己寫一個Framework,在你的Framework里面,三個Task之間的關(guān)系你可以自己定義,而非像Marathon一樣,Task * 3,3個任務不分彼此,你的Framework可以控制這三個Task一主兩備,可以控制三個Task的啟動順序,可以將一個先啟動的Task的IP,位置等通過環(huán)境變量告知另外兩個Task。
寫一個Framework需要寫一個Scheduler,實現(xiàn)一些接口,如文檔 http://mesos.apache.org/docume ... uide/ 中所述。
然后使用使用MesosSchedulerDriver來運行這個Scheduler。

其實Mesos這些模塊之間的通信都是通過Protocol Buffer定義消息來交互的,然而如果讓Framework的開發(fā)人員還要學會如何使用Protocol Buffer消息和Mesos Master通信,是很痛苦的事情,所以MesosSchedulerDriver幫助你做了這個事情,你只需要實現(xiàn)Scheduler定義的接口就可以了,不需要了解這些接口是誰調(diào)用的,調(diào)用了接口之后,消息如何傳給Mesos Master。
所有的接口里面,最重要的是resourceOffers函數(shù),根據(jù)得到的offers(每個slave都有多少資源),創(chuàng)建一系列tasks,然后調(diào)用MesosSchedulerDriver的launchTasks函數(shù),MesosSchedulerDriver會將這些tasks封裝為LaunchTasksMessage發(fā)送給Mesos Master。
第二、寫一個Allocator
通過上面的描述,Mesos有兩層調(diào)度,第一層就是Allocator,將資源分配給Framework。
Mesos允許用戶通過自己寫Module的方式,寫一個so,然后啟動的時候加載進去,然后在命令行里面指定使用so中的哪個Module。
當然寫Allocator的不多,因為Mesos的DRF算法是Mesos的核心,如果不用這個算法,還不如不用mesos。
Mesos源碼中默認的Allocator,即HierarchicalDRFAllocator的位置在$MESOS_HOME/src/master/allocator/mesos/hierarchical.hpp,而DRF中對每個Framework排序的Sorter位于$MESOS_HOME/src/master/allocator/sorter/drf/sorter.cpp,可以查看其源碼了解它的工作原理。
HierarchicalDRF的基本原理
如何作出offer分配的決定是由資源分配模塊Allocator實現(xiàn)的,該模塊存在于Master之中。資源分配模塊確定Framework接受offer的順序,與此同時,確保在資源利用最大化的條件下公平地共享資源。
由于Mesos為跨數(shù)據(jù)中心調(diào)度資源并且是異構(gòu)的資源需求時,資源分配相比普通調(diào)度將會更加困難。因此Mesos采用了DRF(主導資源公平算法 Dominant Resource Fairness)
Framework擁有的全部資源類型份額中占最高百分比的就是Framework的主導份額。DRF算法會使用所有已注冊的Framework來計算主導份額,以確保每個Framework能接收到其主導資源的公平份額。
舉個例子
考慮一個9CPU,18GBRAM的系統(tǒng),擁有兩個用戶,其中用戶A運行的任務的需求向量為{1CPU, 4GB},用戶B運行的任務的需求向量為{3CPU,1GB},用戶可以執(zhí)行盡量多的任務來使用系統(tǒng)的資源。