大資料之Yarn——Capacity排程器概念以及配置
試想一下,你現在所在的公司有一個hadoop的叢集。但是A專案組經常做一些定時的BI報表,B專案組則經常使用一些軟體做一些臨時需求。那麼他們肯定會遇到同時提交任務的場景,這個時候到底如何分配資源滿足這兩個任務呢?是先執行A的任務,再執行B的任務,還是同時跑兩個?
如果你存在上述的困惑,可以多瞭解一些yarn的資源排程器。
在Yarn框架中,排程器是一塊很重要的內容。有了合適的排程規則,就可以保證多個應用可以在同一時間有條不紊的工作。最原始的排程規則就是FIFO,即按照使用者提交任務的時間來決定哪個任務先執行,但是這樣很可能一個大任務獨佔資源,其他的資源需要不斷的等待。也可能一堆小任務佔用資源,大任務一直無法得到適當的資源,造成飢餓。所以FIFO雖然很簡單,但是並不能滿足我們的需求。
yarn預設還提供了兩種排程規則,capacity和fair share。本篇就主要介紹下capacity排程器:
什麼是capacity排程器
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的原則來分配資源的。
特性
capacity排程器具有以下的幾個特性:
- 層次化的佇列設計,這種層次化的佇列設計保證了子佇列可以使用父佇列設定的全部資源。這樣通過層次化的管理,更容易合理分配和限制資源的使用。
- 容量保證,佇列上都會設定一個資源的佔比,這樣可以保證每個佇列都不會佔用整個叢集的資源。
- 安全,每個佇列又嚴格的訪問控制。使用者只能向自己的佇列裡面提交任務,而且不能修改或者訪問其他佇列的任務。
- 彈性分配,空閒的資源可以被分配給任何佇列。當多個隊列出現爭用的時候,則會按照比例進行平衡。
- 多租戶租用,通過佇列的容量限制,多個使用者就可以共享同一個叢集,同事保證每個佇列分配到自己的容量,提高利用率。
- 操作性,yarn支援動態修改調整容量、許可權等的分配,可以在執行時直接修改。還提供給管理員介面,來顯示當前的佇列狀況。管理員可以在執行時,新增一個佇列;但是不能刪除一個佇列。管理員還可以在執行時暫停某個佇列,這樣可以保證當前的佇列在執行過程中,叢集不會接收其他的任務。如果一個佇列被設定成了stopped,那麼就不能向他或者子佇列上提交任務了。
- 基於資源的排程,協調不同資源需求的應用程式,比如記憶體、CPU、磁碟等等。
關於排程器的配置
配置排程器
在ResourceManager中配置它要使用的排程器,配置方式是修改conf/yarn-site.xml,設定屬性:
yarn.resourcemanager.scheduler.class
=>
org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler
配置佇列
排程器的核心就是佇列的分配和使用了,修改conf/capacity-scheduler.xml可以配置佇列。
Capacity排程器預設有一個預定義的佇列——root,所有的佇列都是它的子佇列。佇列的分配支援層次化的配置,使用.
來進行分割,比如yarn.scheduler.capacity.<queue-path>.queues
.
下面是配置的樣例,比如root下面有三個子佇列:
<property>
<name>yarn.scheduler.capacity.root.queues</name>
<value>a,b,c</value>
<description>The queues at the this level (root is the root queue).
</description>
</property>
<property>
<name>yarn.scheduler.capacity.root.a.queues</name>
<value>a1,a2</value>
<description>The queues at the this level (root is the root queue).
</description>
</property>
<property>
<name>yarn.scheduler.capacity.root.b.queues</name>
<value>b1,b2,b3</value>
<description>The queues at the this level (root is the root queue).
</description>
</property>
佇列屬性
- yarn.scheduler.capacity..capacity
它是佇列的資源容量佔比(百分比)。系統繁忙時,每個佇列都應該得到設定的量的資源;當系統空閒時,該佇列的資源則可以被其他的佇列使用。同一層的所有佇列加起來必須是100%。
- yarn.scheduler.capacity..maximum-capacity
佇列資源的使用上限。由於系統空閒時,佇列可以使用其他的空閒資源,因此最多使用的資源量則是該引數控制。預設是-1,即禁用。
- yarn.scheduler.capacity..minimum-user-limit-percent
每個任務佔用的最少資源。比如,你設定成了25%。那麼如果有兩個使用者提交任務,那麼每個任務資源不超過50%。如果3個使用者提交任務,那麼每個任務資源不超過33%。如果4個使用者提交任務,那麼每個任務資源不超過25%。如果5個使用者提交任務,那麼第五個使用者需要等待才能提交。預設是100,即不去做限制。
- yarn.scheduler.capacity..user-limit-factor
每個使用者最多使用的佇列資源佔比,如果設定為50.那麼每個使用者使用的資源最多就是50%。
執行和提交應用限制
- yarn.scheduler.capacity.maximum-applications / yarn.scheduler.capacity..maximum-applications
設定系統中可以同時執行和等待的應用數量。預設是10000.
- yarn.scheduler.capacity.maximum-am-resource-percent / yarn.scheduler.capacity..maximum-am-resource-percent
設定有多少資源可以用來執行app master,即控制當前啟用狀態的應用。預設是10%。
佇列管理
- yarn.scheduler.capacity..state
佇列的狀態,可以使RUNNING或者STOPPED.如果佇列是STOPPED狀態,那麼新應用不會提交到該佇列或者子佇列。同樣,如果root被設定成STOPPED,那麼整個叢集都不能提交任務了。現有的應用可以等待完成,因此佇列可以優雅的退出關閉。
- yarn.scheduler.capacity.root..acl_submit_applications
訪問控制列表ACL控制誰可以向該佇列提交任務。如果一個使用者可以向該佇列提交,那麼也可以提交任務到它的子佇列。
- yarn.scheduler.capacity.root..acl_administer_queue
設定佇列的管理員的ACL控制,管理員可以控制佇列的所有應用程式。同樣,它也具有繼承性。
注意:ACL的設定是user1,user2 group1,group2
這種格式。如果是*
則代表任何人。空格
表示任何人都不允許。預設是*
.
其他屬性
- yarn.scheduler.capacity.resource-calculator
資源計算方法,預設是org.apache.hadoop.yarn.util.resource.DefaultResourseCalculator
,它只會計算記憶體。DominantResourceCalculator
則會計算記憶體和CPU。
- yarn.scheduler.capacity.node-locality-delay
排程器嘗試進行排程的次數。一般都是跟叢集的節點數量有關。預設40(一個機架上的節點數)
一旦設定完這些佇列屬性,就可以在web ui上看到了。可以訪問下面的連線:
xxx:8088/scheduler
修改佇列配置
如果想要修改佇列或者排程器的配置,可以修改
vi $HADOOP_CONF_DIR/capacity-scheduler.xml
修改完成後,需要執行下面的命令:
$HADOOP_YARN_HOME/bin/yarn rmadmin -refreshQueues
注意:
- 佇列不能被刪除,只能新增。
- 更新佇列的配置需要是有效的值
- 同層級的佇列容量限制想加需要等於100%。
引數
1 Hadoop YARN配置引數剖析(5)—Capacity Scheduler相關引數
作者:xingoo