Yarn的CapacityScheduler與DRF瞭解

    Capacity Scheduler以隊列爲單位劃分資源,每個隊列可以設定一定比例的資源最低保證和使用上限,每個用戶也可以設定一定的資源使用上限以防止濫用隊列中的資源。當一個隊列的資源有剩餘時,可暫時將剩餘資源給其他隊列使用。

    在yarn-site.xml文件中指定使用CapacityScheduler

     <property>

      <name>yarn.resourcemanager.scheduler.class</name>

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

    </property>

 

Capacity Scheduler介紹:

容量調度器有個預定義的隊列,名字是root,所有的隊列都是root的子隊列。更多的子隊列可以被設置,通過配置yarn.scheduler.capacity.root.queues,逗號分開的子隊列即可(同一級隊列資源佔比加起來必須是100%)。如下所示:

  <property>

     <name>yarn.scheduler.capacity.root.queues</name>

     <value>a,b</value>

  <property>

 

子隊列還可以繼續設置子隊列:

<property>

  <name>yarn.scheduler.capacity.root.a.queues</name>

  <value>a1,a2,a3</value>

  </description>

</property>

 

每個子隊列設置如下資源相關配置:

  <property>

    <name>yarn.scheduler.capacity.root.a.capacity</name>

    <value>10</value>

  </property>

系統繁忙時,a這個隊列最少可以佔用root隊列10%的資源(如果a這個隊列不是很繁忙,那麼這個隊列中的資源可能被其他隊列借走)。注意,子隊列值之和要等於100

 

  <property>

    <name>yarn.scheduler.capacity.root.a.maximum-capacity</name>

    <value>100</value>

  </property>

系統繁忙時,a這個隊列最多可以佔用root隊列100%的資源,該配置決定了隊列資源的上限。

 

  <property>

    <name>yarn.scheduler.capacity.root.a.user-limit-factor</name>

    <value>1</value>

  </property>

    每個用戶可以使用隊列資源佔比,當前1表示可以使用100%的capacity資源

 

  <property>

    <name>yarn.scheduler.capacity.root.a.state</name>

    <value>RUNNING</value>

  </property>

    隊列的狀態,可以爲STOPPED或者RUNNING,

 

  <property>

    <name>yarn.scheduler.capacity.root.a.acl_submit_applications</name>

    <value>*</value>

  </property>

  <property>

    <name>yarn.scheduler.capacity.root.a.acl_administer_queue</name>

    <value>*</value>

  </property>

    這兩個設置用於限制那些用戶可以使用隊列,*表示不限制

 

除了以上這些,還有一些其他的配置:

  <property>

    <name>yarn.scheduler.capacity.maximum-applications</name>

    <value>10000</value>

   </property>

    集羣中application最大數目

 

  <property>

    <name>yarn.scheduler.capacity.maximum-am-resource-percent</name>

    <value>0.1</value>

  </property>

集羣中用於運行應用程序ApplicationMaster的資源比例上限,該參數通常用於限制處於活動狀態的應用程序數目。所有隊列的ApplicationMaster資源比例上限可通過參數yarn.scheduler.capacity.maximum-am-resource-percent設置,而單個隊列可通過參數yarn.scheduler.capacity.<queue-path>.maximum-am-resource-percent設置適合自己的值

 

  <property>

<name>yarn.scheduler.capacity.resource-calculator</name>  

<value>org.apache.hadoop.yarn.util.resource.DominantResourceCalculator</value>

  </property>

    設置使用的資源分配算法,該算法會同時考慮CPU以及內存資源,讓所有Application的“主要資源佔比”資源儘可能的均等。

 

DRF算法說明:

DRF資源分配算法的設計思想是,讓所有Application的“主要資源佔比”儘量均等,對於Yarn來說資源指的就是CPU及內存。

    DRF是基於Max-min fairness算法改進而來,不同的是Max-min fairness算法只支持某種單一資源的分配,該算法的詳細內容可以看參考中的鏈接,此處不展開細說。大概想法是給每個用戶都根據權重分配一定比例的資源,資源有的多的任務,將這些資源再按照權重分別給那些資源不夠的任務。

    DRF首先會計算任務是CPU密集型資源還是內存密集型資源,哪個佔的比例大哪個就稱爲主資源。DRF就是將Max-min fairness算法應用在主資源上,最大化主資源。上一張論文中的經典例子:

    系統中一共有9個CPU,18G內存,任務A需要(1CPU,4G內存),任務B需要(3CPU,1G內存),因爲1/9 < 4/18,所以任務A的主資源是內存,任務B的主資源是CPU。

 

每次迭代都要選擇一個用戶爲其分配資源,用戶的選擇辦法:選擇當前主資源佔比最小的用戶,即已經分配給用戶的主資源佔這種資源總量的比例哪個小,優先給哪個用戶分配資源。

所以個人覺得論文上的這圖好像有點問題,應該是ABABA纔對,因爲一開始A對主資源的需求比B要小,4/18 < 3/9。

Yarn實際應用中還會考慮任務設置的權重,資源分配的思路和這個是差不多的。

 

 

 

 

 

參考:

    https://my.oschina.net/guol/blog/1574106(Yarn Web UI參數解析)

    https://www.jianshu.com/p/7b1dbb772f93(Max-min fairness最大最小公平算法)

    http://static.usenix.org/event/nsdi11/tech/full_papers/Ghodsi.pdf(DRF算法論文)

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章