YARN資源調度策略之Fair Scheduler

目的

這篇文章是對公平調度器(FairScheduler)的說明,它是hadoop的一個可插拔的調度器,目的是讓應用程序在YARN上能夠公平的共享巨大的集羣資源。

介紹

公平調度是一種將資源分配給應用程序的方法,這樣所有應用程序平均都能在一段時間內獲得相同的資源份額。Hadoop NextGen能夠調度多個資源類型。默認情況下,Fair調度器僅基於內存來進行公平性決策。利用Ghodsi等人提出的占主導地位的資源公平性概念,可以將其配置爲同時使用內存和CPU進行調度。當只有一個應用程序運行時,該應用程序將使用整個羣集資源。當其他應用被提交時,釋放的資源被分配給新的應用,這樣每個應用最終獲得的資源量大致相同。與默認的Hadoop調度程序(它構造一個應用程序隊列)不同,它允許小的應用程序在合理的時間內完成,而不會使耗時長的應用捱餓。這也是在多個用戶之間共享集羣的合理方法。最後,公平分享也可以與應用程序優先級一起工作-優先級被用作權重,以確定每個應用程序應獲得的總資源的百分比。

調度程序將應用程序進一步組織到“隊列”中,並在這些隊列之間公平地共享資源。默認情況下,所有用戶共享一個名爲“default”的隊列。如果應用程序在容器資源請求中明確列出隊列,則請求將提交到該隊列。還可以通過配置根據請求中包含的用戶名分配隊列。在每個隊列中,調度策略用於在運行的應用程序之間共享資源。默認情況下是基於內存的公平共享,但也可以配置具有主要資源公平性的FIFO和多資源共享策略。隊列可以按層次結構排列以劃分資源,並配置權重以按特定比例共享集羣。

除了提供公平共享外,公平調度程序還允許將保證的最小資源分配給隊列,這對於確保某些用戶、組或生產應用程序始終獲得足夠的資源非常有用。當隊列包含應用程序時,它至少獲得其最小共享,但當隊列不需要其完全保證的共享時,多餘的部分將在其他正在運行的應用程序之間分配。這樣,當隊列不包含應用程序時,調度器可以保證隊列的容量,同時有效地利用資源。

Fair調度程序允許默認情況下運行所有應用程序,但也可以通過配置文件限制每個用戶和每個隊列運行的應用程序數。當用戶必須一次提交數百個應用程序時,這可能很有用;如果同時運行太多應用程序會導致創建太多中間數據或切換太多上下文,這通常可以提高性能。限制應用不會導致任何隨後提交的應用失敗,只會在計劃程序隊列中等待,直到用戶的某些早期應用完成。

具備可插拔策略的分層隊列

fair調度程序支持分層隊列。所有隊列的根是“root”。可用資源以典型的公平調度方式分佈在根隊列的子隊列中。然後,子隊列以同樣的方式將分配給他們的資源分配給他們的下級隊列。應用程序只能在葉隊列上調度。通過將隊列作爲其父隊列的子元素放置在公平調度程序分配文件中,可以將隊列指定爲其他隊列的子隊列。

隊列的名稱以其父隊列的名稱開頭,句點作爲分隔符。因此,根隊列下名爲“queue1”的隊列稱爲“root.queue1”,名爲“parent1”的隊列下名爲“queue2”的隊列稱爲“root.parent1.queue2”。當引用隊列時,名稱的根部分是可選的,因此queue1可以被稱爲“queue1”,queue2可以被稱爲“parent1.queue2”。

此外,fair調度器允許爲每個隊列設置不同的自定義策略,以允許以用戶希望的任何方式共享隊列的資源。可以通過擴展org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.SchedulingPolicy來構建自定義策略。FifoPolicy、FairSharePolicy(默認)和DominantResourceFairnessPolicy都是內置的,可以隨時使用。

在原始(MR1)公平調度程序中還沒有支持某些附加項。其中之一,是使用一種自定義策略來管理優先“提升”某些應用程序。

自動將應用程序放入隊列

Fair調度程序允許管理員配置策略,以便自動將提交的應用程序放置到適當的隊列中。程序具體放入哪個隊列取決於提交者的用戶(user)和組(group)以及應用程序傳遞的請求隊列名。策略由一組有順序的規則組成,這些規則用於對傳入的應用程序進行分類。每個規則要麼將應用放入隊列,要麼拒絕它,要麼繼續下一個規則。有關如何配置這些策略,請參閱下面的分配文件格式。

安裝

要使用Fair調度程序,請首先在yarn-site.xml中分配適當的調度程序類:

<property>
  <name>yarn.resourcemanager.scheduler.class</name>
  <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value>
</property>

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)中,主要用於配置各個隊列的資源量、權重等信息。

yarn-site.xml

參數名稱 說明 缺省值
yarn.scheduler.fair.allocation.file 自定義XML配置文件所在位置,該文件主要用於描述各個隊列的屬性,比如資源量、權重等,具體配置格式將在後面介紹。
yarn.scheduler.fair.user-as-default-queue 當應用程序未指定隊列名時,是否指定用戶名作爲應用程序所在的隊列名。如果設置爲false或者未設置,所有未知隊列的應用程序將被提交到default隊列中 true
yarn.scheduler.fair.preemption 是否啓用搶佔機制 false
yarn.scheduler.fair.sizebasedweight 在一個隊列內部分配資源時,默認情況下,採用公平輪詢的方法將資源分配各各個應用程序,而該參數則提供了另外一種資源分配方式:按照應用程序資源需求數目分配資源,即需求資源數量越多,分配的資源越多。 false
yarn.scheduler.assignmultiple 是否啓動批量分配功能。當一個節點出現大量資源時,可以一次分配完成,也可以多次分配完成。 false
yarn.scheduler.fair.max.assign 如果開啓批量分配功能,可指定一次分配的container數目。 -1,表示不限制。
yarn.scheduler.fair.locality.threshold.node 當應用程序請求某個節點上資源時,它可以接受的可跳過的最大資源調度機會。當按照分配策略,可將一個節點上的資源分配給某個應用程序時,如果該節點不是應用程序期望的節點,可選擇跳過該分配機會暫時將資源分配給其他應用程序,直到出現滿足該應用程序需的節點資源出現。通常而言,一次心跳代表一次調度機會,而該參數則表示跳過調度機會佔節點總數的比例 -1.0,表示不跳過任何調度機會
yarn.scheduler.fair.locality.threshold.rack 當應用程序請求某個機架上資源時,它可以接受的可跳過的最大資源調度機會。
yarn.scheduler.increment-allocation-mb 內存規整化單位 默認是1024,這意味着,如果一個Container請求資源是1.5GB,則將被調度器規整化爲ceiling(1.5 GB / 1GB) * 1G=2GB。
yarn.scheduler.increment-allocation-vcores 虛擬CPU規整化單位 默認是1,含義與內存規整化單位類似。

自定義配置文件

Fair Scheduler允許用戶將隊列信息專門放到一個配置文件(默認是fair-scheduler.xml),對於每個隊列,管理員可配置以下幾個選項:

參數名稱 說明 缺省值
minResources 最少資源保證量,設置格式爲“X mb, Y vcores”,當一個隊列的最少資源保證量未滿足時,它將優先於其他同級隊列獲得資源,對於不同的調度策略(後面會詳細介紹),最少資源保證量的含義不同,對於fair策略,則只考慮內存資源,即如果一個隊列使用的內存資源超過了它的最少資源量,則認爲它已得到了滿足;對於drf策略,則考慮主資源使用的資源量,即如果一個隊列的主資源量超過它的最少資源量,則認爲它已得到了滿足。
maxResources 最多可以使用的資源量,fair scheduler會保證每個隊列使用的資源量不會超過該隊列的最多可使用資源量。
maxRunningApps 最多同時運行的應用程序數目。通過限制該數目,可防止超量Map Task同時運行時產生的中間輸出結果撐爆磁盤。
minSharePreemptionTimeout 最小共享量搶佔時間。如果一個資源池在該時間內使用的資源量一直低於最小資源量,則開始搶佔資源。
schedulingMode/schedulingPolicy 隊列採用的調度模式,可以是fifo、fair或者drf。
aclSubmitApps 可向隊列中提交應用程序的Linux用戶或用戶組列表,默認情況下爲“*”,表示任何用戶均可以向該隊列提交應用程序。需要注意的是,該屬性具有繼承性,即子隊列的列表會繼承父隊列的列表。配置該屬性時,用戶之間或用戶組之間用“,”分割,用戶和用戶組之間用空格分割,比如“user1, user2 group1,group2”。
aclAdministerApps 該隊列的管理員列表。一個隊列的管理員可管理該隊列中的資源和應用程序,比如可殺死任意應用程序。

官方文檔:https://hadoop.apache.org/docs/current/hadoop-yarn/hadoop-yarn-site/FairScheduler.html

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