目前得分布式系統中,對於資源管理都采用動態資源划分來取代靜態資源划分。它有如下好處:
- 集群資源利用率高
- 增加數據共享能力,可以多種計算框架公用一份分布式存儲數據。
資源管理抽象模型
概念模型
常見得資源主要是CPU,內存,網絡資源,磁盤IO。主要概念模型有3類:資源組織模型,調度策略,任務組織模型。不同的資源管理平台主要就是這三點不同:
通用架構
- 每台節點上都會配置節點管理器,不斷像資源收集器匯報本機資源使用情況,並負責容器得管理動作。
- 調度器,由資源收集器和調度策略兩部分組成。
資源調度器設計的基本問題
資源的異質性和工作負載的異質性
- 資源的異質性:一般將資源划分為細粒度解決,例如:內存(天然細粒度),CPU(提出通過使用時間划分虛擬CPU)
- 任務的異質性:不同的任務有不同的應用場景,給任務分不同的優先級
數據的局部性
調度系統應該充分考慮數據的局部性,分為:節點局部性,機架局部性,全局局部性(這叫不局部好一些吧)
搶占調度和非搶占調度
當前資源得不到滿足得情況下,是否應該考慮殺掉前面優先級低得任務。目前Yarn支持搶占式調度,Mesos支持非搶占式調度
資源分配粒度
根據任務的不同,有兩種資源分配粒度:
- 一次性資源資源分配
- 增量資源分配
- 儲備資源分配:慢慢增量資源分配,直到可以達到任務啟動的最低資源量
除此之外,Yarn和Mesos對於每個任務的粒度不同。Yarn的最小資源粒度為slot,里面封裝了固定量的CPU和內存,Mesos的可以用戶精細化地指定任務的資源粒度。
餓死或死鎖
- 餓死:如果任務長期達不到所需資源,這些資源就有可能餓死
- 死鎖:兩個資源相互等待對方的資源,從而形成一種競爭,變為死鎖狀態。
系統中一共有10份資源
任務 | 需要資源 | 已有資源 |
---|---|---|
A | 6 | 5 |
B | 6 | 5 |
資源隔離方案
目前的主流方案是采用Linux Container,主要依賴內核的cgroup子系統達到資源隔離。我們的系統采用的是輕量級的開源容器docker
資源調度范形
- 集中式調度器:既有資源調度也有任務調度
- 兩級調度器:一級調度器負責調度資源,二級調度器根據一級調度器分配的資源負責調度任務
- 共享狀態調度器:二級調度器可以看到集群中所有的資源,調度結束后交給一級調度器仲裁。
兩級調度器主要是悲觀調度策略,共享狀態調度器主要是樂觀調度策略
調度策略
Yarn的資源調度器
無論FifoScheduler,CapacityScheduler和FairScheduler的核心資源分配模型都是一樣的。
調度器維護一群隊列的信息。用戶可以向一個或者多個隊列提交應用。調度器,根據一定的規則選擇一個隊列,再在隊列上選擇一個應用,嘗試在這個應用上分配資源。不過,因為一些參數限制了分配失敗,就會繼續選擇下一個應用。在選擇了一個應用之后,這個應用對應也會有很多的資源申請的請求。調度器會優先匹配本地資源是申請請求,其次是同機架的,最后的任意機器的。
所以,不同的調度器就是在回答如何選擇一個隊列,如何選擇一個應用的問題。
三種調度器的對比:
FIFO
作業按照提交時間或則優先級放入隊列中,資源調度的時候按照先后順序進行調度。這種調度模型過於簡單,用戶過多的時候容易出現長時間等待調度的情況。
容量調度器
多用戶的情況下,最大化集群的吞吐和利用率
Capacity調度器說的通俗點,可以理解成一個個的資源隊列。這個資源隊列是用戶自己去分配的。比如我大體上把整個集群分成了AB兩個隊列,A隊列給A項目組的人來使用。B隊列給B項目組來使用。但是A項目組下面又有兩個方向,那么還可以繼續分,比如專門做BI的和做實時分析的。那么隊列的分配就可以參考下面的樹形結構:
root
------a[60%]
|---a.bi[40%]
|---a.realtime[60%]
------b[40%]
a隊列占用整個資源的60%,b隊列占用整個資源的40%。a隊列里面又分了兩個子隊列,一樣也是2:3分配。
雖然有了這樣的資源分配,但是並不是說a提交了任務,它就只能使用60%的資源,那40%就空閑着。只要資源實在空閑狀態,那么a就可以使用100%的資源。但是一旦b提交了任務,a就需要在釋放資源后,把資源還給b隊列,直到ab平衡在3:2的比例。
粗粒度上資源是按照上面的方式進行,在每個隊列的內部,還是按照FIFO的原則來分配資源的。
選擇資源使用量最小的隊列,然后隊列內部通過FIFO選擇應用。每個隊列都有資源最低保障和資源使用上限,當資源有剩余的時候,可以分配給其它隊列使用。
公平調度器
多用戶的情況下,強調用戶公平地貢獻資源,默認是考慮的內存公平
- 根據每個隊列的最小資源保證量(最小共享量),將系統資源分配給隊列。
- 根據隊列的優先級,將剩余資源分配給各個隊列。
公平排序法(如何選擇隊列和應用):
- 資源需求量。當前隊列或者應用希望獲得的資源的總量。
- 最小共享量。隊列的最小共享量在配置中指定。應用的最小共享量為0。
- 資源使用量。當前隊列或者應用分配到的總資源。
- 權值。隊列的權重值在配置中指定。在開啟sizebasedweight特性的情況下,應用的權重=(log2(資源需求量))優先級調整因子。優先級當前都是1,。當應用運行超過5分鍾,調整因子為3。
1.計算比較體是否需要資源。即資源使用量是否小於資源需求量且小於最小共享量。
2.如果兩者都需要資源,計算資源分配比=資源使用量/Min(資源需求量,最小共享量)。資源分配比較小的優先。
3.如果一個需要,一個不需要,需要的優先。
4.如果兩者都不需要資源,計算使用權值比=資源使用量/權值。使用權值比較小的優先。
5.如果2或者4中的比較相同,則先提交的優先。
公平資源共享算法(資源搶占)
公平資源共享算法的目的是為了每個隊列公平地使用資源,這個公平體現在每個隊列得到的資源比等於他們的權值比。如果只是單純地求一個資源權重比,可以直接相除。但是由於需要滿足隊列的資源分配滿足最小共享量、最大資源量這些隊列上下界的限制,權值資源比不能直接計算。
- 設置根隊列的公平資源量為全局資源總和
- 根隊列調用recomputeFairShares,計算公平資源量
- 計算當前隊列的分配量=MIN(隊列總需求,公平資源量)
- 計算資源權重比最大值。最大值=2*n,使得Fun(最大值)>集群資源量>Fun(最大值/2)。
- 計算資源權重比。采用二分法計算,二分法次數最多25次。每個隊列的公平資源量=(權重*權重資源比,用最小共享量修正下界,用資源需求量修正上界)
- 設置每個子隊列的公平資源量=資源權重比*權值。
- 各個子隊列調用recomputeFairShares,遞歸計算。
DRF
保障任務主要資源的公平利用