Apache Mesos能夠成為最優(yōu)秀的數(shù)據(jù)中心資源管理器的一個(gè)重要功能是面對(duì)各種類型的應(yīng)用,它具備像交警一樣的疏導(dǎo)能力。本文將深入Mesos的資源分配內(nèi)部,探討Mesos是如何根據(jù)客戶應(yīng)用需求,平衡公平資源共享的。在開始之前,如果讀者還沒有閱讀這個(gè)系列的前序文章,建議首先閱讀它們。第一篇是Mesos的概述,第二篇是兩級(jí)架構(gòu)的說明,第三篇是數(shù)據(jù)存儲(chǔ)和容錯(cuò)。
我們將探討Mesos的資源分配模塊,看看它是如何確定將什么樣的資源邀約發(fā)送給具體哪個(gè)Framework,以及在必要時(shí)如何回收資源。讓我們先來回顧一下Mesos的任務(wù)調(diào)度過程:
從前面提到的兩級(jí)架構(gòu)的說明一文中我們知道,Mesos Master代理任務(wù)的調(diào)度首先從Slave節(jié)點(diǎn)收集有關(guān)可用資源的信息,然后以資源邀約的形式,將這些資源提供給注冊(cè)其上的Framework。
Framework可以根據(jù)是否符合任務(wù)對(duì)資源的約束,選擇接受或拒絕資源邀約。一旦資源邀約被接受,F(xiàn)ramework將與Master協(xié)作調(diào)度任務(wù),并在數(shù)據(jù)中心的相應(yīng)Slave節(jié)點(diǎn)上運(yùn)行任務(wù)。
如何作出資源邀約的決定是由資源分配模塊實(shí)現(xiàn)的,該模塊存在于Master之中。資源分配模塊確定Framework接受資源邀約的順序,與此同時(shí),確保在本性貪婪的Framework之間公平地共享資源。在同質(zhì)環(huán)境中,比如Hadoop集群,使用最多的公平份額分配算法之一是最大最小公平算法(max-min fairness)。最大最小公平算法算法將最小的資源分配最大化,并將其提供給用戶,確保每個(gè)用戶都能獲得公平的資源份額,以滿足其需求所需的資源;一個(gè)簡(jiǎn)單的例子能夠說明其工作原理,請(qǐng)參考最大最小公平份額算法頁面的示例1。如前所述,在同質(zhì)環(huán)境下,這通常能夠很好地運(yùn)行。同質(zhì)環(huán)境下的資源需求幾乎沒有波動(dòng),所涉及的資源類型包括CPU、內(nèi)存、網(wǎng)絡(luò)帶寬和I/O。然而,在跨數(shù)據(jù)中心調(diào)度資源并且是異構(gòu)的資源需求時(shí),資源分配將會(huì)更加困難。例如,當(dāng)用戶A的每個(gè)任務(wù)需要1核CPU、4GB內(nèi)存,而用戶B的每個(gè)任務(wù)需要3核CPU、1GB內(nèi)存時(shí),如何提供合適的公平份額分配策略?當(dāng)用戶A的任務(wù)是內(nèi)存密集型,而用戶B的任務(wù)是CPU密集型時(shí),如何公平地為其分配一攬子資源?
因?yàn)镸esos是專門管理異構(gòu)環(huán)境中的資源,所以它實(shí)現(xiàn)了一個(gè)可插拔的資源分配模塊架構(gòu),將特定部署最適合的分配策略和算法交給用戶去實(shí)現(xiàn)。例如,用戶可以實(shí)現(xiàn)加權(quán)的最大最小公平性算法,讓指定的Framework相對(duì)于其它的Framework獲得更多的資源。默認(rèn)情況下,Mesos包括一個(gè)嚴(yán)格優(yōu)先級(jí)的資源分配模塊和一個(gè)改良的公平份額資源分配模塊。嚴(yán)格優(yōu)先級(jí)模塊實(shí)現(xiàn)的算法給定Framework的優(yōu)先級(jí),使其總是接收并接受足以滿足其任務(wù)要求的資源邀約。這保證了關(guān)鍵應(yīng)用在Mesos中限制動(dòng)態(tài)資源份額上的開銷,但是會(huì)潛在其他Framework饑餓的情況。
由于這些原因,大多數(shù)用戶默認(rèn)使用DRF(主導(dǎo)資源公平算法 Dominant Resource Fairness),這是Mesos中更適合異質(zhì)環(huán)境的改良公平份額算法。
DRF和Mesos一樣出自Berkeley AMPLab團(tuán)隊(duì),并且作為Mesos的默認(rèn)資源分配策略實(shí)現(xiàn)編碼。
讀者可以從此處和此處閱讀DRF的原始論文。在本文中,我將總結(jié)其中要點(diǎn)并提供一些例子,相信這樣會(huì)更清晰地解讀DRF。讓我們開始揭秘之旅。
DRF的目標(biāo)是確保每一個(gè)用戶,即Mesos中的Framework,在異質(zhì)環(huán)境中能夠接收到其最需資源的公平份額。為了掌握DRF,我們需要了解主導(dǎo)資源(dominant resource)和主導(dǎo)份額(dominant share)的概念。Framework的主導(dǎo)資源是其最需的資源類型(CPU、內(nèi)存等),在資源邀約中以可用資源百分比的形式展示。例如,對(duì)于計(jì)算密集型的任務(wù),它的Framework的主導(dǎo)資源是CPU,而依賴于在內(nèi)存中計(jì)算的任務(wù),它的Framework的主導(dǎo)資源是內(nèi)存。因?yàn)橘Y源是分配給Framework的,所以DRF會(huì)跟蹤每個(gè)Framework擁有的資源類型的份額百分比;Framework擁有的全部資源類型份額中占最高百分比的就是Framework的主導(dǎo)份額。DRF算法會(huì)使用所有已注冊(cè)的Framework來計(jì)算主導(dǎo)份額,以確保每個(gè)Framework能接收到其主導(dǎo)資源的公平份額。
概念過于抽象了吧?讓我們用一個(gè)例子來說明。假設(shè)我們有一個(gè)資源邀約,包含9核CPU和18GB的內(nèi)存。Framework 1運(yùn)行任務(wù)需要(1核CPU、4GB內(nèi)存),F(xiàn)ramework 2運(yùn)行任務(wù)需要(3核CPU、1GB內(nèi)存)
Framework 1的每個(gè)任務(wù)會(huì)消耗CPU總數(shù)的1/9、內(nèi)存總數(shù)的2/9,因此Framework 1的主導(dǎo)資源是內(nèi)存。同樣,F(xiàn)ramework 2的每個(gè)任務(wù)會(huì)CPU總數(shù)的1/3、內(nèi)存總數(shù)的1/18,因此Framework 2的主導(dǎo)資源是CPU。DRF會(huì)嘗試為每個(gè)Framework提供等量的主導(dǎo)資源,作為他們的主導(dǎo)份額。在這個(gè)例子中,DRF將協(xié)同F(xiàn)ramework做如下分配:Framework 1有三個(gè)任務(wù),總分配為(3核CPU、12GB內(nèi)存),F(xiàn)ramework 2有兩個(gè)任務(wù),總分配為(6核CPU、2GB內(nèi)存)。
此時(shí),每個(gè)Framework的主導(dǎo)資源(Framework 1的內(nèi)存和Framework 2的CPU)最終得到相同的主導(dǎo)份額(2/3或67%),這樣提供給兩個(gè)Framework后,將沒有足夠的可用資源運(yùn)行其他任務(wù)。需要注意的是,如果Framework 1中僅有兩個(gè)任務(wù)需要被運(yùn)行,那么Framework 2以及其他已注冊(cè)的Framework將收到的所有剩余的資源。
那么,DRF是怎樣計(jì)算而產(chǎn)生上述結(jié)果的呢?如前所述,DRF分配模塊跟蹤分配給每個(gè)Framework的資源和每個(gè)框架的主導(dǎo)份額。每次,DRF以所有Framework中運(yùn)行的任務(wù)中最低的主導(dǎo)份額作為資源邀約發(fā)送給Framework。如果有足夠的可用資源來運(yùn)行它的任務(wù),F(xiàn)ramework將接受這個(gè)邀約。通過前面引述的DRF論文中的示例,我們來貫穿DRF算法的每個(gè)步驟。為了簡(jiǎn)單起見,示例將不考慮短任務(wù)完成后,資源被釋放回資源池中這一因素,我們假設(shè)每個(gè)Framework會(huì)有無限數(shù)量的任務(wù)要運(yùn)行,并認(rèn)為每個(gè)資源邀約都會(huì)被接受。
回顧上述示例,假設(shè)有一個(gè)資源邀約包含9核CPU和18GB內(nèi)存。Framework 1運(yùn)行的任務(wù)需要(1核CPU、4GB內(nèi)存),F(xiàn)ramework 2運(yùn)行的任務(wù)需要(3核CPU、2GB內(nèi)存)。Framework 1的任務(wù)會(huì)消耗CPU總數(shù)的1/9、內(nèi)存總數(shù)的2/9,F(xiàn)ramework 1的主導(dǎo)資源是內(nèi)存。同樣,F(xiàn)ramework 2的每個(gè)任務(wù)會(huì)CPU總數(shù)的1/3、內(nèi)存總數(shù)的1/18,F(xiàn)ramework 2的主導(dǎo)資源是CPU。
上面表中的每一行提供了以下信息:
注意,每個(gè)行中的最低主導(dǎo)份額以粗體字顯示,以便查找。
最初,兩個(gè)Framework的主導(dǎo)份額是0%,我們假設(shè)DRF首先選擇的是Framework 2,當(dāng)然我們也可以假設(shè)Framework 1,但是最終的結(jié)果是一樣的。
需要注意的是,可以創(chuàng)建一個(gè)資源分配模塊,使用加權(quán)的DRF使其偏向某個(gè)Framework或某組Framework。如前面所提到的,也可以創(chuàng)建一些自定義模塊來提供組織特定的分配策略。
一般情況下,現(xiàn)在大多數(shù)的任務(wù)是短暫的,Mesos能夠等待任務(wù)完成并重新分配資源。然而,集群上也可以跑長(zhǎng)時(shí)間運(yùn)行的任務(wù),這些任務(wù)用于處理掛起作業(yè)或行為不當(dāng)?shù)腇ramework。
值得注意的是,在當(dāng)資源釋放的速度不夠快的情況下,資源分配模塊具有撤銷任務(wù)的能力。Mesos嘗試如此撤銷任務(wù):向執(zhí)行器發(fā)送請(qǐng)求結(jié)束指定的任務(wù),并給出一個(gè)寬限期讓執(zhí)行器清理該任務(wù)。如果執(zhí)行器不響應(yīng)請(qǐng)求,分配模塊就結(jié)束該執(zhí)行器及其上的所有任務(wù)。
分配策略可以實(shí)現(xiàn)為,通過提供與Framework相關(guān)的保證配置,來阻止對(duì)指定任務(wù)的撤銷。如果Framework低于保證配置,Mesos將不能結(jié)束該Framework的任務(wù)。
我們還需了解更多關(guān)于Mesos資源分配的知識(shí),但是我將戛然而止。接下來,我要說點(diǎn)不同的東西,是關(guān)于Mesos社區(qū)的。我相信這是一個(gè)值得考慮的重要話題,因?yàn)殚_源不僅包括技術(shù),還包括社區(qū)。
說完社區(qū),我將會(huì)寫一些關(guān)于Mesos的安裝和Framework的創(chuàng)建和使用的,逐步指導(dǎo)的教程。在一番實(shí)操教學(xué)的文章之后,我會(huì)回來做一些更深入的話題,比如Framework與Master是如何互動(dòng)的,Mesos如何跨多個(gè)數(shù)據(jù)中心工作等。
與往常一樣,我鼓勵(lì)讀者提供反饋,特別是關(guān)于如果我打標(biāo)的地方,如果你發(fā)現(xiàn)哪里不對(duì),請(qǐng)反饋給我。我非全知,虛心求教,所以非常期待讀者的校正和啟示。我們也可以在twitter上溝通,請(qǐng)關(guān)注 @hui_kenneth。
查看英文原文:?PLAYING TRAFFIC COP: RESOURCE ALLOCATION IN APACHE MESOS
更多建議: