yarn默認(rèn)使用的是最簡單的FIFO調(diào)度器,即一個default隊(duì)列,所有用戶共享,分配資源也是先到先得,沒有優(yōu)先級之分。有時一兩個任務(wù)就把資源全占了,其他任務(wù)吃不到資源造成饑餓,顯然這樣的資源分配是不合理的(在當(dāng)今社會主義之中,我們要共同富裕?。?。yarn還有兩種資源調(diào)度器,capacity schedule和fair schedule,本文主要研究下capacity schedule。

什么是capacity schedule

Capacity Schedule調(diào)度器以隊(duì)列為單位劃分資源。簡單通俗點(diǎn)來說,就是一個個隊(duì)列有獨(dú)立的資源,隊(duì)列的結(jié)構(gòu)和資源是可以進(jìn)行配置的,如下圖:
平面設(shè)計(jì)培訓(xùn),網(wǎng)頁設(shè)計(jì)培訓(xùn),美工培訓(xùn),游戲開發(fā),動畫培訓(xùn)

default隊(duì)列占30%資源,analyst和dev分別占40%和30%資源;類似的,analyst和dev各有兩個子隊(duì)列,子隊(duì)列在父隊(duì)列的基礎(chǔ)上再分配資源。

隊(duì)列以分層方式組織資源,設(shè)計(jì)了多層級別的資源限制條件以更好的讓多用戶共享一個Hadoop集群,比如隊(duì)列資源限制、用戶資源限制、用戶應(yīng)用程序數(shù)目限制。隊(duì)列里的應(yīng)用以FIFO方式調(diào)度,每個隊(duì)列可設(shè)定一定比例的資源最低保證和使用上限,同時,每個用戶也可以設(shè)定一定的資源使用上限以防止資源濫用。而當(dāng)一個隊(duì)列的資源有剩余時,可暫時將剩余資源共享給其他隊(duì)列。

特性

Capacity調(diào)度器具有以下的幾個特性:
● 層次化的隊(duì)列設(shè)計(jì),這種層次化的隊(duì)列設(shè)計(jì)保證了子隊(duì)列可以使用父隊(duì)列設(shè)置的全部資源。這樣通過層次化的管理,更容易合理分配和限制資源的使用。
● 容量保證,隊(duì)列上都會設(shè)置一個資源的占比,這樣可以保證每個隊(duì)列都不會占用整個集群的資源。
● 安全,每個隊(duì)列又嚴(yán)格的訪問控制。用戶只能向自己的隊(duì)列里面提交任務(wù),而且不能修改或者訪問其他隊(duì)列的任務(wù)。
● 彈性分配,空閑的資源可以被分配給任何隊(duì)列。當(dāng)多個隊(duì)列出現(xiàn)爭用的時候,則會按照比例進(jìn)行平衡。
● 多租戶租用,通過隊(duì)列的容量限制,多個用戶就可以共享同一個集群,同時保證每個隊(duì)列分配到自己的容量,提高利用率。
● 操作性,yarn支持動態(tài)修改調(diào)整容量、權(quán)限等的分配,可以在運(yùn)行時直接修改。還提供給管理員界面,來顯示當(dāng)前的隊(duì)列狀況。管理員可以在運(yùn)行時,添加一個隊(duì)列;但是不能刪除一個隊(duì)列。管理員還可以在運(yùn)行時暫停某個隊(duì)列,這樣可以保證當(dāng)前的隊(duì)列在執(zhí)行過程中,集群不會接收其他的任務(wù)。如果一個隊(duì)列被設(shè)置成了stopped,那么就不能向他或者子隊(duì)列上提交任務(wù)了。
● 基于資源的調(diào)度,協(xié)調(diào)不同資源需求的應(yīng)用程序,比如內(nèi)存、CPU、磁盤等等。

配置

開啟調(diào)度器

在ResourceManager中配置它要使用的調(diào)度器,配置方式是修改conf/yarn-site.xml,設(shè)置屬性:

<property>
    <name>yarn.resourcemanager.scheduler.class</name>   
    <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</value></property>

配置隊(duì)列

調(diào)度器的核心就是隊(duì)列的分配和使用了,修改conf/capacity-scheduler.xml可以配置隊(duì)列。
Capacity調(diào)度器默認(rèn)有一個預(yù)定義的隊(duì)列——root,所有的隊(duì)列都是它的子隊(duì)列。隊(duì)列的分配支持層次化的配置,使用.來進(jìn)行分割,比如yarn.scheduler.c