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

具體如下圖所示。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM