1. 程式人生 > >yarn資源排程詳解

yarn資源排程詳解

Fair Scheduler將整個Yarn的可用資源劃分成多個資源池,每個資源池中可以配置最小和最大的可用資源(記憶體和CPU)、最大可同時執行Application數量、權重、以及可以提交和管理Application的使用者等。

現在一般的大資料平臺也都提供了可配置的介面:

以TDH為例:


default 也就是有一個預設的佇列,


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

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

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:公平共享量搶佔時間。如果一個資源池在該時間內使用資源量一直低於公平共享量的一半,則開始搶佔資源。

根據使用者名稱分配資源池


如圖所示,假設整個Yarn叢集的可用資源為100vCPU,100GB記憶體,現在為3個業務各自規劃一個資源池,另外,規劃一個default資源池,用於執行其他使用者和業務提交的任務。如果沒有在任務中指定資源池(通過引數mapreduce.job.queuename),那麼可以配置使用使用者名稱作為資源池名稱來提交任務,即使用者businessA提交的任務被分配到資源池businessA中,使用者businessC提交的任務被分配到資源池businessC中。除了配置的固定使用者,其他使用者提交的任務將會被分配到資源池default中。

這裡的使用者名稱,就是提交Application所使用的Linux/Unix使用者名稱。

另外,每個資源池可以配置允許提交任務的使用者名稱,比如,在資源池businessA中配置了允許使用者businessA和使用者lxw1234提交任務,如果使用使用者lxw1234提交任務,並且在任務中指定了資源池為businessA,那麼也可以正常提交到資源池businessA中。
根據權重獲得額外的空閒資源

在每個資源池的配置項中,有個weight屬性(預設為1),標記了資源池的權重,當資源池中有任務等待,並且叢集中有空閒資源時候,每個資源池可以根據權重獲得不同比例的叢集空閒資源。

比如,資源池businessA和businessB的權重分別為2和1,這兩個資源池中的資源都已經跑滿了,並且還有任務在排隊,此時叢集中有30個Container的空閒資源,那麼,businessA將會額外獲得20個Container的資源,businessB會額外獲得10個Container的資源。
最小資源保證

在每個資源池中,允許配置該資源池的最小資源,這是為了防止把空閒資源共享出去還未回收的時候,該資源池有任務需要執行時候的資源保證。

比如,資源池businessA中配置了最小資源為(5vCPU,5GB),那麼即使沒有任務執行,Yarn也會為資源池businessA預留出最小資源,一旦有任務需要執行,而叢集中已經沒有其他空閒資源的時候,這個最小資源也可以保證資源池businessA中的任務可以先執行起來,隨後再從叢集中獲取資源。
動態更新資源配額

Fair Scheduler除了需要在yarn-site.xml檔案中啟用和配置之外,還需要一個XML檔案來配置資源池以及配額,而該XML中每個資源池的配額可以動態更新,之後使用命令:yarn rmadmin –refreshQueues 來使得其生效即可,不用重啟Yarn叢集。

需要注意的是:動態更新只支援修改資源池配額,如果是新增或減少資源池,則需要重啟Yarn叢集。

    預設排程演算法的考量因子是memory,但是也可以也可以設定DRF(Dominant Resource Fairness), 會考慮mem和vcore的資源.

domain模式和default模式有什麼區別呢
default表示資源分配只由記憶體決定,Dominant表示資源分配由CPU和記憶體之間的主導資源決定。例如,如果使用者A執行CPU重的任務,並且使用者B執行記憶體繁重的任務,則Dominant會分配更多的CPU和更少的記憶體到使用者A執行的任務,併為使用者B執行的任務分配更少的CPU和更多的記憶體。而default不會考慮這些。

    priorities的使用

    the priorities are used as weights to determine the fraction of total resources that each app should get.

    當佇列沒有任務時,最小資源可以被其他佇列搶走;當有新的任務進來時,如果叢集有資源則獲取資源,如果沒有則會從其他低優先順序的佇列中搶到資源,執行任務

    哪些情況下會發生搶佔
        最小資源搶佔, 當前queue的資源無法保障時,而又有apps執行,需要向外搶佔.
        公平排程搶佔, 當前queue的資源為達到max,而又有apps執行,需要向外搶佔.

    ACL許可權控制
    目前簡單的就是使用,基於linux使用者、使用者組賬號的ACL

有兩個控制,提交應用、管理應用: aclSubmitApps、aclAdministerApps


    An example allocation file is given here:

<?xml version="1.0"?>
<allocations>
  <queue name="sample_queue">
    <minResources>10000 mb,0vcores</minResources>
    <maxResources>90000 mb,0vcores</maxResources>
    <maxRunningApps>50</maxRunningApps>
    <maxAMShare>0.1</maxAMShare>
    <weight>2.0</weight>
    <schedulingPolicy>fair</schedulingPolicy>
    <queue name="sample_sub_queue">
      <aclSubmitApps>charlie</aclSubmitApps>
      <minResources>5000 mb,0vcores</minResources>
    </queue>
  </queue>

  <queueMaxAMShareDefault>0.5</queueMaxAMShareDefault>
  <queueMaxResourcesDefault>40000 mb,0vcores</queueMaxResourcesDefault>

  <!-- Queue 'secondary_group_queue' is a parent queue and may have
       user queues under it -->
  <queue name="secondary_group_queue" type="parent">
  <weight>3.0</weight>
  <maxChildResources>4096 mb,4vcores</maxChildResources>
  </queue>

  <user name="sample_user">
    <maxRunningApps>30</maxRunningApps>
  </user>
  <userMaxAppsDefault>5</userMaxAppsDefault>

  <queuePlacementPolicy>
    <rule name="specified" />
    <rule name="primaryGroup" create="false" />
    <rule name="nestedUserQueue">
        <rule name="secondaryGroupExistingQueue" create="false" />
    </rule>
    <rule name="default" queue="sample_queue"/>
  </queuePlacementPolicy>
</allocations>

yarn還支援在佇列之間移動程式,可以把一個重要的程式放到一個優先順序更高的佇列,或者把不重要的任務移動優先順序低的佇列

Moving applications between queues

The Fair Scheduler supports moving a running application to a different queue. This can be useful for moving an important application to a higher priority queue, or for moving an unimportant application to a lower priority queue. Apps can be moved by running yarn application -movetoqueue appID -queue targetQueueName.

When an application is moved to a queue, its existing allocations become counted with the new queue’s allocations instead of the old for purposes of determining fairness. An attempt to move an application to a queue will fail if the addition of the app’s resources to that queue would violate the its maxRunningApps or maxResources constraints.


部落格:http://dongxicheng.org/mapreduce-nextgen/hadoop-yarn-configurations-fair-scheduler/


1、fair-scheduler.xml中的weight的作用是什麼?怎麼樣能測出來weight的作用?
2、使用fair排程策略,會不會出現負載不均衡的現象?網上說:預設批處理會出現負載不均衡,但每次都是均衡的, 涉及到yarn.scheduler.fair.max.assign 和yarn.scheduler.assignmultiple 兩個配置項。這塊到底是什麼樣的?


(1) weight主要用在資源共享之時,weight越大,拿到的資源越多。比如一個pool中有20GB記憶體用不了,這時候可以共享給其他pool,其他每個pool拿多少,就是由權重決定的
(2)fair也會出現,均衡不均衡是相對的,只不多這兩個引數可以緩解。


---------------------
作者:fireflies愛人如己
來源:CSDN
原文:https://blog.csdn.net/sinat_29581293/article/details/58143159
版權宣告:本文為博主原創文章,轉載請附上博文連結!