1. 程式人生 > >Hadoop YARN配置引數剖析(4)—Fair Scheduler相關引數

Hadoop YARN配置引數剖析(4)—Fair Scheduler相關引數

首先在yarn-site.xml中,將配置引數yarn.resourcemanager.scheduler.class設定為org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler

Fair Scheduler的配置選項包括兩部分,其中一部分在yarn-site.xml中,主要用於配置排程器級別的引數,另外一部分在一個自定義配置檔案(預設是fair-scheduler.xml)中,主要用於配置各個佇列的資源量、權重等資訊。

想要了解Fair Scheduler是什麼,可閱讀我的這篇文章“Hadoop公平排程器分析”

1. 配置檔案yarn-site.xml

(1) yarn.scheduler.fair.allocation.file :自定義XML配置檔案所在位置,該檔案主要用於描述各個佇列的屬性,比如資源量、權重等,具體配置格式將在後面介紹。

(2)  yarn.scheduler.fair.user-as-default-queue:當應用程式未指定佇列名時,是否指定使用者名稱作為應用程式所在的佇列名。如果設定為false或者未設定,所有未知佇列的應用程式將被提交到default佇列中,預設值為true。

(3)  yarn.scheduler.fair.preemption:是否啟用搶佔機制,預設值是false。

(4)  yarn.scheduler.fair.sizebasedweight:在一個佇列內部分配資源時,預設情況下,採用公平輪詢的方法將資源分配各各個應用程式,而該引數則提供了另外一種資源分配方式:按照應用程式資源需求數目分配資源,即需求資源數量越多,分配的資源越多。預設情況下,該引數值為false。

(5)  yarn.scheduler.assignmultiple:是否啟動批量分配功能。當一個節點出現大量資源時,可以一次分配完成,也可以多次分配完成。預設情況下,該引數值為false。

(6)  yarn.scheduler.fair.max.assign:如果開啟批量分配功能,可指定一次分配的container數目。預設情況下,該引數值為-1,表示不限制。

(7)  yarn.scheduler.fair.locality.threshold.node:當應用程式請求某個節點上資源時,它可以接受的可跳過的最大資源排程機會。當按照分配策略,可將一個節點上的資源分配給某個應用程式時,如果該節點不是應用程式期望的節點,可選擇跳過該分配機會暫時將資源分配給其他應用程式,直到出現滿足該應用程式需的節點資源出現。通常而言,一次心跳代表一次排程機會,而該引數則表示跳過排程機會佔節點總數的比例,預設情況下,該值為-1.0,表示不跳過任何排程機會。

(8)  yarn.scheduler.fair.locality.threshold.rack:當應用程式請求某個機架上資源時,它可以接受的可跳過的最大資源排程機會。

(9)  yarn.scheduler.increment-allocation-mb:記憶體規整化單位,預設是1024,這意味著,如果一個Container請求資源是1.5GB,則將被排程器規整化為ceiling(1.5 GB / 1GB) * 1G=2GB。

(10)  yarn.scheduler.increment-allocation-vcores:虛擬CPU規整化單位,預設是1,含義與記憶體規整化單位類似。

2. 自定義配置檔案

Fair Scheduler允許使用者將佇列資訊專門放到一個配置檔案(預設是fair-scheduler.xml),對於每個佇列,管理員可配置以下幾個選項:

(1)  minResources :最少資源保證量,設定格式為“X mb, Y vcores”,當一個佇列的最少資源保證量未滿足時,它將優先於其他同級佇列獲得資源,對於不同的排程策略(後面會詳細介紹),最少資源保證量的含義不同,對於fair策略,則只考慮記憶體資源,即如果一個佇列使用的記憶體資源超過了它的最少資源量,則認為它已得到了滿足;對於drf策略,則考慮主資源使用的資源量,即如果一個佇列的主資源量超過它的最少資源量,則認為它已得到了滿足。

(2)  maxResources:最多可以使用的資源量,fair scheduler會保證每個佇列使用的資源量不會超過該佇列的最多可使用資源量。

(3)  maxRunningApps:最多同時執行的應用程式數目。通過限制該數目,可防止超量Map Task同時執行時產生的中間輸出結果撐爆磁碟。

(4)  minSharePreemptionTimeout:最小共享量搶佔時間。如果一個資源池在該時間內使用的資源量一直低於最小資源量,則開始搶佔資源。

(5)  schedulingMode/schedulingPolicy:佇列採用的排程模式,可以是fifo、fair或者drf。

(6)  aclSubmitApps:可向佇列中提交應用程式的Linux使用者或使用者組列表,預設情況下為“*”,表示任何使用者均可以向該佇列提交應用程式。需要注意的是,該屬性具有繼承性,即子佇列的列表會繼承父佇列的列表。配置該屬性時,使用者之間或使用者組之間用“,”分割,使用者和使用者組之間用空格分割,比如“user1, user2 group1,group2”。

(7)  aclAdministerApps:該佇列的管理員列表。一個佇列的管理員可管理該佇列中的資源和應用程式,比如可殺死任意應用程式。

管理員也可為單個使用者新增maxRunningJobs屬性限制其最多同時執行的應用程式數目。此外,管理員也可通過以下引數設定以上屬性的預設值:

(1)  userMaxJobsDefault:使用者的maxRunningJobs屬性的預設值。

(2) defaultMinSharePreemptionTimeout :佇列的minSharePreemptionTimeout屬性的預設值。

(3)  defaultPoolSchedulingMode:佇列的schedulingMode屬性的預設值。

(4)  fairSharePreemptionTimeout:公平共享量搶佔時間。如果一個資源池在該時間內使用資源量一直低於公平共享量的一半,則開始搶佔資源。

實 例】假設要為一個Hadoop叢集設定三個佇列queueA、queueB和queueC,其中,queueB和queueC為queueA的子佇列,且規定普通使用者最多可同時執行40個應用程式,但使用者userA最多可同時執行400個應用程式,那麼可在自定義配置檔案中進行如下設定:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 <allocations> <queue name=”queueA”> <minResources>100 mb, 100 vcores</minResources> <maxResources>150 mb, 150 vcores</maxResources> <maxRunningApps>200</maxRunningApps> <minSharePreemptionTimeout>300</minSharePreemptionTimeout> <weight>1.0</weight> <queue name=”queueB”> <minResources>30 mb, 30 vcores</minResources> <maxResources>50 mb, 50 vcores</maxResources> </queue> <queue name=”queueC”> <minResources>50 mb, 50 vcores</minResources> <maxResources>50 mb, 50 vcores</maxResources> </queue> </queue> <user name=”userA”> <maxRunningApps>400</maxRunningApps> </user> <userMaxAppsDefault>40</userMaxAppsDefault> <fairSharePreemptionTimeout>6000</fairSharePreemptionTimeout> </allocations>