yarn中一個基本的調度單元是隊列。
yarn的內置調度器:
1.FIFO先進先出,一個的簡單調度器,適合低負載集群。
2.Capacity調度器,給不同隊列(即用戶或用戶組)分配一個預期最小容量,在每個隊列內部用層次化的FIFO來調度多個應用程序。
3.Fair公平調度器,針對不同的應用(也可以為用戶或用戶組),每個應用屬於一個隊列,主旨是讓每個應用分配的資源大體相當。(當然可以設置權重),若是只有一個應用,那集群所有資源都是他的。 適用情況:共享大集群、隊列之間有較大差別。
capacity調度器的啟用:
在ResourceManager節點上的yarn-site.xml設置
Property===>yarn.resourcemanager.scheduler.class
Value=====>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler
capacity調度器的配置:
在目錄$HADOOP_HOME/hadoop/etc/hadoop/capacity-scheduler.xml
修改完成后,需要執行下面的命令:
$HADOOP_YARN_HOME/bin/yarn rmadmin -refreshQueues 使功能動態生效。
capacity-scheduler.xml的配置
1.定義層級隊列
1 <property> 2 <name>yarn.scheduler.capacity.root.queues</name> 3 <value>a,b,c</value> //root根隊列下有三個子隊列 4 <description>The queues at the this level (root is the root queue). 5 </description> 6 </property> 7 8 <property> 9 <name>yarn.scheduler.capacity.root.a.queues</name> 10 <value>a1,a2</value> //root.a隊列下有2個子隊列 11 <description>The queues at the this level (root is the root queue). 12 </description> 13 </property> 14 15 <property> 16 <name>yarn.scheduler.capacity.root.b.queues</name> 17 <value>b1,b2,b3</value> //root.b隊列下有3個子隊列 18 <description>The queues at the this level (root is the root queue). 19 </description> 20 </property>
2.隊列的調度
如上定義了
/----------a-----------a1
-----------a2
b----------b1
----------b2
----------b3
c
這種結構的隊列。
隊列調度算法工作方式
- 在每一層級,隊列排序是根據當前隊列使用資源的占比確定的,(占比相同,根據隊列全路徑名排序)
- 根隊列將集群容量分配給第一層父隊列(a,b,c),並對每個父隊列遞歸調度。(a,b,c三個隊列容量之和為100,容量是按百分比分配的)
- 父隊列下的(同層級)子隊列調度同上,也按容量限制。
- 子隊列下管理的多個應用程序,按照FIFO方式調度資源。
每個隊列都有最大最小資源占用限制,單個用戶不會占盡集群資源,后文Capacity資源分配部分會詳細介紹。
3.隊列的訪問權限控制
配置文件 $HADOOP_HOME/hadoop/etc/hadoop/capacity-scheduler.xml
<property> <name>yarn.scheduler.capacity.root.a.acl_submit_applications</name> <value>user1,user2 group</value> </property>
<property> <name>yarn.scheduler.capacity.root.a.acl_administer_queue</name> <value>"group"</value> </property>
配置了可以提交任務到root.a隊列的用戶或用戶組,其他用戶沒有權限提交任務到這個隊列。value=*表示所有用戶都可以提交。
root.a隊列的管理員group,有權限查看該隊列所有用戶提交的應用程序細節。
4.隊列容量配置
<property> <name>yarn.scheduler.capacity.root.a.capacity</name> <value>40</value> <description>隊列a占40%</description> </property> <property> <name>yarn.scheduler.capacity.root.b.capacity</name> <value>50</value> <description>隊列b占50%</description> </property> <property> <name>yarn.scheduler.capacity.root.c.capacity</name> <value>10</value> <description>隊列c占10%</description> </property>
隊列容量是以百分比表示的,按照a:b:c即4:5:1的比例共享集群資源。
子隊列容量配置
<property> <name>yarn.scheduler.capacity.root.a.a1.capacity</name> <value>30</value> <description>隊列root.a.a1占30%</description> </property> <property> <name>yarn.scheduler.capacity.root.a.a2.capacity</name> <value>70</value> <description>隊列root.a.a2占70%</description> </property>
層級結構中同層級子隊列容量之和不超過100%。
容量彈性配置項
<property> <name>yarn.scheduler.capacity.root.a.a1.maximum-capacity</name> <value>40</value> </property>
該設置項表示可以超出父隊列容量的40%,即總容量=分配的容量*140%。(實在其他隊列空閑的情況下,若是其他隊列有充足的任務進行,是按照比例分配的)
5.用戶級別限制
用戶最小資源占用設置
<property> <name>yarn.scheduler.capacity.root.a.a1.minimun-user-limit-percent</name> <value>20</value> </property>
如上配置表示一個用戶最少能占用隊列root.a.a1容量的20%。
隨着提交任務用戶數的增長,有如下情況:
1.剛開始隊列空閑,只有user1提交任務后,user1獨占隊列。
2.user2開始提交任務,user1多占用的資源不會立即釋放,等user1的Container完成任務后才分配給user2。(如果Capacity調度器的搶占功能打開,user1占用的Container會被立即殺死並分配給user2)
3.第6個用戶user6提交任務后(前5個用戶都有任務在執行),不會分配資源給user6,應為要保證最少資源占用20%的保障,user6會放在等待列表,等待一個或多個用戶任務結束。
4.每個用戶提交的任務,基於FIFO順序調度,先提交的任務優先級高於后提交的任務。
用戶容量彈性配置項
<property> <name>yarn.scheduler.capacity.root.a.a1.user-limit-factor</name> <value>2</value> </property>
該配置默認值為1,表示單個用戶最大可以占該隊列容量的100%,為2表示單個用戶最大可以占該隊列容量的200%。
6.隊列的狀態
YARN中隊列有2種狀態:運行和停止。
<property> <name>yarn.scheduler.capacity.root.a.a1.state</name> <value>RUNNING</value> <description> State can be one of RUNNING or STOPPED. </description> </property>
7.應用程序限制
<property> <name>yarn.scheduler.capacity.maximum-applications</name> <value>10000</value> <description> 特定隊列最大允許應用程序總數 </description> </property> <property> <name>yarn.scheduler.capacity.maximum-am-resource-percent</name> <value>0.1</value> <description> AppMaster占用隊列資源的最大比例 </description> </property>
若要限制指定隊列,修改為yarn.scheduler.capacity.root.a.maximum-am-resource-percent和yarn.scheduler.capacity.root.a.maximum-applications
參考:
《hadoop yarn權威指南》第8章 YARN中的Capacity調度器