Mesos資源調度器的實現分析

<h3>1 mesos DRF介紹</h3> <p>mesos調度器是根據DRF(dominant resource fairness)算法實現的。DRF算法背後的直觀想法是在多資源類型的環境下,一個用戶的資源分配應該由用戶的dominant share(主導份額的資源)決定,dominant share是在全部已經分配給用戶的多種資源中,佔據最大份額的一種資源。</p> <p>mesos使用resource offers的方式實現各個框架之間的資源分配。Resource offer是多個slave節點上的一組空閒資源。Master根據調度策略來決定提供多少資源給每個framework,經過以Resource offer的形式發送給發送給框架,而後框架響應Resource offer,確認Resource offer中已使用的資源和返回剩餘的空閒資源。</p> <p>mesos的資源分配器是一個分層的加權max-min fairness的實現。經過抽象了一個role概念,將framework按照role進行分組。那麼資源分配就能夠分爲兩層:首先是在各個框架羣組間經過加權的DRF算法進行排序;其次在框架羣組內部,對各個framework使用加權DRF算法進行排序。而後按照最終的排序結果,從小到大對各個框架進行Resource Offer。以下圖所示。</p> <p><a href="http://static.oschina.net/uploads/img/201312/18222102_mV4N.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://static.oschina.net/uploads/img/201312/18222102_JNMa.png" width="446" height="362" /></a> </p> <h3>2 mesos資源分配器的實現</h3> <p>Mesos的調度器實現分爲兩部分,分別是Allocators和sorter,Allocator定義和實現了資源分配器的接口和邏輯。Sorter對資源使用者進行排序,使用具體的資源分配算法來進行排序。</p> <p>Sorter的實現是DRFSorter,DRFSorter使用DRF算法來對資源使用者進行排序。</p> <p>Allocator的實現HierarchicalAllocatorProcess,實現了一個分層的分配器,對framework進行分組,分別在各組之間和組內部使用DRFSorter進行排序。</p> <h4>DRFSorter</h4> <p>DRFSorter經過每一個用戶的dominant share的值實現對client排序。DRFSorter中的幾個概念以下:</p> <p><strong>一、Client</strong>:資源的使用者。定義以下</p> <p>struct Client</p> <p>{</p> <p>&#160; std::string name;&#160;&#160;&#160;&#160;&#160;&#160; //資源使用者名稱</p> <p>&#160; double share;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; //資源使用者的分配到的資源份額</p> <p>};</p> <p>Client之間的排序是首先比較share值的大小,若是在share相等的前提下則須要比較name的大小。</p> <p><strong>二、Resource</strong>:表示一種資源,包含資源name、資源的值以及資源被那些framework偏好。Pb的定義以下:</p> <p>message Resource {</p> <p>&#160; required string name = 1;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; //資源名稱</p> <p>&#160; required Value.Type type = 2;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; //資源值的類型Scalar</p> <p>&#160; optional Value.Scalar scalar = 3;&#160;&#160;&#160;&#160; //值類型爲標量,Cpu和內存的值類型都爲標量</p> <p>&#160; optional Value.Ranges ranges = 4;&#160;&#160;&#160;&#160;&#160; //值類型爲範圍</p> <p>&#160; optional Value.Set set = 5;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; //值類型爲集合</p> <p>&#160; optional string role = 6 [default = &quot;*&quot;];&#160; //框架對於資源的偏好</p> <p>}</p> <p>Mesos的應用環境是多資源類型的集羣環境,全部能夠框架申請的是多種資源,經過Resource數組來表示。</p> <p><strong>三、Weight</strong>:各個client的資源分配的權重。定義的類型爲double</p> <p>以下圖所示,爲了對client的進行排序,DRFSorter須要在內部維護了一些信息,見下圖:</p> <p><a href="http://static.oschina.net/uploads/img/201312/18222103_nV1Y.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://static.oschina.net/uploads/img/201312/18222103_rK9l.png" width="404" height="337" /></a> </p> <p>dirty:表示DRFSorter的資源分配發生更改,須要從新計算各個client的share值。</p> <p>clients:資源使用者的集合,使用紅黑樹,按照client的dominant share值進行排序。</p> <p>Resources:此DRFSorter擁有的總資源值。</p> <p>整個DRFSorter的接口有兩類,第一類是增長、刪除和修改client和resource,在資源發生變化時,DRFSorter會將dirty置爲true。第二類是對client進行排序,在dirty爲true的狀況下,會對全部的client從新計算dominant share的值,而後從新插入集合中,返回排序結果。</p> <p>DRFSorter的核心排序流程以下:</p> <p>| 若是dirty標誌位爲true</p> <p>&#160;&#160;&#160;&#160;&#160; | 遍歷clients集合,計算各個client的share值</p> <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | 計算client的各個resource的值佔DRFSorter此類型資源總值的比例,</p> <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 找出最大值而後再除以client的權重,就獲得了client的share值。</p> <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 公式爲:Share = <a href="http://static.oschina.net/uploads/img/201312/18222103_HLYh.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://static.oschina.net/uploads/img/201312/18222103_xmyN.png" width="174" height="26" /></a> ,<a href="http://static.oschina.net/uploads/img/201312/18222103_XP5T.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://static.oschina.net/uploads/img/201312/18222103_DiBN.png" width="21" height="23" /></a> 爲client分配到的資源i的值,</p> <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <a href="http://static.oschina.net/uploads/img/201312/18222103_sqbb.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://static.oschina.net/uploads/img/201312/18222104_hxg3.png" width="20" height="22" /></a> 爲資源i在DRFSorter中的總值。W爲client的權重。</p> <p>&#160;&#160;&#160;&#160;&#160; | 再從新插入client,進行重排序。</p> <p>| 返回排序後的結果。</p> <h4>Allocator</h4> <p>實現了一個分層的分配器,以下圖所示,用戶能夠根據role對framework進行分組,在RoleInfo指定framework group的權重,專門有一個DRFSorter對各個framework分組的資源分配進行排序。而後各個framework group內部還有一個DRFSorter對group內部的各個framework的資源分配進行排序。</p> <p>Allocator的一些概念以下</p> <p><strong>一、Framework</strong>:應用程序框架,向mesos獲取集羣資源,下發具體的計算任務,是集羣的使用者。</p> <p>struct Framework</p> <p>{</p> <p>&#160; hashset&lt;Filter*&gt; filters;&#160; //framework的過濾器</p> <p>&#160; bool checkpoint;&#160;&#160;&#160;&#160; //是否正在進行checkpoint</p> <p>&#160; FrameworkInfo info;&#160;&#160; //framework的信息</p> <p>};</p> <p><strong>二、Slave</strong>:運行在各個集羣節點的後臺任務,執行具體的計算任務,上報節點的資源和負載。</p> <p>struct Slave</p> <p>{</p> <p>&#160; .............</p> <p>&#160; Resources available;&#160;&#160;&#160; //當前可用的資源</p> <p>&#160; bool whitelisted;&#160;&#160;&#160;&#160;&#160;&#160; //是否在白名單中,若是false,則不能進行resource offer</p> <p>&#160; bool checkpoint;&#160;&#160;&#160;&#160;&#160;&#160; //是否正在checkpoint,若是正在進行checkpoint,是不能進行resource offer</p> <p>&#160; SlaveInfo info;&#160;&#160;&#160;&#160;&#160;&#160;&#160; //slave信息</p> <p>};</p> <p><strong>三、Role</strong>:用於對framework進行分組,能夠爲每組framework指定一個weight。Role的信息RoleInfo以下。</p> <p>message RoleInfo {</p> <p>&#160; required string name = 1;</p> <p>&#160; optional double weight = 2 [default = 1];</p> <p>}</p> <p><strong>四、Whitelist</strong>:指定了有效的slave,若是制定了白名單,那麼白名單內的slave是有效的。</p> <p>過濾器:用於框架對slave的資源進行過濾,能夠用於拒絕特定slave上的資源。</p> <p>爲了實現資源分配,allocator須要在內部維護以下一些信息,見下圖。</p> <p><a href="http://static.oschina.net/uploads/img/201312/18222104_DRbc.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://static.oschina.net/uploads/img/201312/18222104_AwXx.png" width="434" height="402" /></a> </p> <p>frameworks:框架的映射,從framework Id到框架信息的映射。</p> <p>slaves:slave的映射,從slave Id到slave信息的映射。</p> <p>roles:框架分組信息的映射。</p> <p>FrameworkSorters:框架羣組內部DRF排序容器的映射。</p> <p>Role Sorter:框架羣組之間進行DRF排序的容器。</p> <p>allocator核心的調度邏輯:</p> <p>| 對framework group進行從小到大排序(framework按照role進行分組)</p> <p>| 遍歷排序後的framework group</p> <p>&#160;&#160;&#160;&#160;&#160; | 在group組內對各個framework進行排序</p> <p>&#160;&#160;&#160;&#160;&#160; | 遍歷排序後的framework</p> <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | 遍歷slave集合,將知足要求的全部slave的可用資源發送給框架</p> <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | 提取slave中role爲」*」的全部可用資源資源,」*」表示通常普適的資源。</p> <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | 提取與framework group的role相同的全部可用的slave資源</p> <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; (此爲提取框架偏好的slave資源)。</p> <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | 判斷slave資源是否知足條件:</p> <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | 過濾資源,若是slave或者framework正在進行checkpoint或者</p> <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 資源被framework中設定的過濾器過濾掉。則放棄資源</p> <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | slave不在白名單中,放棄資源。</p> <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | slave的資源小於最小資源限定,放棄資源。</p> <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | 將以上都條件都知足的資源加入到資源結果集合中,</p> <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 並更新slave的可用資源(須要減去已經放入到結果集合中的資源)</p> <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | 若是資源結果集合不爲空</p> <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | 更新資源,即slave中可用資源</p> <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; | 執行resource offer操做,將資源下發給框架</p> <p>分配器在如下狀況下進行resource offer:</p> <p>一、在新的slave加入到mesos集羣中。</p> <p>二、在新的framework加入到mesos集羣中。</p> <p>三、在定時地執行資源分配,時間能夠經過配置文件進行配置。</p> <p>allocator在資源分配時,提供了以下四個機制:</p> <p>一、過濾器:框架能夠設置過濾器來拒絕的特定資源。好比framework在某一個slave上屢次執行失敗,那麼framework就能夠經過對這個slave設定過濾器來拒絕這個slave上的資源。</p> <p>二、slave的白名單:不在白名單內的slave不參與resource offer。</p> <p>三、slave的最小資源限定:mesos的資源調度等同於一個裝箱問題。裝箱問題的浪費空間與物體的最大大小和箱子的大小的比率相關,箱子越大物體越小那麼利用率越高。可是當一個集羣被請求小量資源的任務佔滿時,那麼一個請求大量資源的框架可能會飢餓。爲了適應請求大資源任務的框架,mesos經過設定slave節點最小資源限定,來避免在slave上進行offer resource,直到slave上的空閒資源達到最小資源供給大小。</p> <p>四、框架對slave資源的偏好。經過resource中的role參數來實現,能夠經過設定slave的資源的role值和以及將框架按照role進行分組,來實現框架羣組的專用資源和資源偏好。</p> <p>我的認爲Mesos分配器的一些缺陷以下:</p> <p>一、Mesos的resource offer從本質上一種悲觀的併發控制,從核心的調度邏輯上咱們能夠看到,Mesos的每一次調度會一次性地將全部可用的資源都發送給一個框架,在收到框架的響應後,纔會返回剩餘的資源,繼續下一次調度。Mesos的調度性能依賴於框架對resource offer的快速響應。並且mesos沒有對resource offer設定一個超時回收機制(我的閱讀了0.14版本的mesos代碼,沒有發現這個機制),若是有一個框架接收了resource offer以後,長時間沒有響應,那麼整個mesos集羣就會發生死鎖。</p> <p>二、Mesos實現fairness是經過對框架按照權重和已分配的dominant share資源進行排序來實現的。Mesos若是要實現dominant resource fairness的性能隔離或者sharing incentive依賴於框架的實現,若是有一個貪婪的框架在一次resource offer中佔用了大量資源並長時間不釋放,那麼其餘framework就會處於一種飢餓的狀態。Mesos適用於那些使用短任務和擁有可擴展的彈性機制的框架。</p> <p>三、mesos不支持框架對資源搶佔,框架沒法獲取整個集羣的狀態。</p> <p>&#160;</p> <p>做者zy,QQ105789990</p>算法

相關文章
相關標籤/搜索