Hadoop:容量排程器

用途

此文件說明 CapacityScheduler,一個 Hadoop 的可插入式排程器,允許多個租戶安全地共用一個大型叢集,以便在已分配容量的限制下,適時地將資源分配給他們的應用程式。

概述

CapacityScheduler 的設計目的是以對操作人員友善的方式,將 Hadoop 應用程式作為一個共用的多租戶叢集執行,同時最大化叢集的吞吐量和使用率。

傳統上,每個組織都有自己的私人運算資源集,其容量足以在尖峰或接近尖峰的條件下滿足組織的 SLA。這通常會導致平均使用率不佳,以及管理多個獨立叢集(每個組織一個)的開銷。在組織之間共用叢集是執行大型 Hadoop 安裝的經濟有效方式,因為這允許他們在不建立私人叢集的情況下,獲得規模經濟的優點。然而,組織擔心共用叢集,因為他們擔心其他人會使用對其 SLA 至關重要的資源。

CapacityScheduler 的設計目的是允許共用大型叢集,同時為每個組織提供容量保證。其核心概念是 Hadoop 叢集中的可用資源在多個組織之間共用,這些組織根據其運算需求共同為叢集提供資金。一個額外的好處是,組織可以存取其他組織未使用的任何多餘容量。這以經濟有效的方式為組織提供彈性。

跨組織共用叢集需要強力的多租戶支援,因為必須保證每個組織的容量,並提供防護措施以確保共用叢集不受單一惡意應用程式、使用者或其集合的影響。CapacityScheduler 提供一組嚴格的限制,以確保叢集中的單一應用程式、使用者或佇列無法消耗不成比例的資源。此外,CapacityScheduler 對單一使用者和佇列的已初始化和待處理應用程式設定限制,以確保叢集的公平性和穩定性。

CapacityScheduler 提供的主要抽象概念是 佇列。這些佇列通常由管理員設定,以反映共用叢集的經濟效益。

為了進一步控制和預測資源共用,CapacityScheduler 支援 階層式佇列,以確保在允許其他佇列使用免費資源之前,資源在組織的子佇列之間共用,從而為特定組織的應用程式共用免費資源提供 親和性

功能

CapacityScheduler 支援下列功能

  • 階層式佇列 - 支援佇列階層,以確保在允許其他佇列使用空閒資源之前,資源會在組織的子佇列間共享,從而提供更多控制和可預測性。

  • 容量保證 - 佇列會分配網格容量的一小部分,表示一定容量的資源將供其使用。提交至佇列的所有應用程式都可存取分配給該佇列的容量。管理員可以設定每個佇列分配容量的軟性限制和選擇性硬性限制。

  • 安全性 - 每個佇列都有嚴格的 ACL,用於控制哪些使用者可以將應用程式提交至個別佇列。此外,還有安全防護措施,以確保使用者無法查看和/或修改其他使用者的應用程式。此外,也支援每個佇列和系統管理員角色。

  • 彈性 - 可以將空閒資源分配給任何超過其容量的佇列。當這些資源在未來某個時間點來自執行低於容量的佇列的需求時,當排程在這些資源上的工作完成後,它們將被分配給執行低於容量的佇列上的應用程式(也支援搶佔)。這可確保佇列以可預測且彈性的方式取得資源,從而防止叢集中出現人為的資源孤島,有助於使用率。

  • 多租戶 - 提供全面的限制,以防止單一應用程式、使用者和佇列壟斷佇列或整個叢集的資源,以確保叢集不會不堪負荷。

  • 可操作性

    • 執行時期設定 - 管理員可以以安全的方式在執行時期變更佇列定義和屬性,例如容量、ACL,以將對使用者的中斷降至最低。此外,還提供一個主控台供使用者和管理員查看系統中各種佇列的目前資源配置。管理員可以在執行時期「新增其他佇列」,但除非佇列已停止且沒有待處理/執行中的應用程式,否則無法在執行時期「刪除」佇列。

    • 排空應用程式 - 管理員可以在執行時期「停止」佇列,以確保在現有應用程式執行完成時,無法提交新的應用程式。如果佇列處於已停止狀態,則無法將新的應用程式提交至本身任何其子佇列。現有應用程式會繼續執行至完成,因此可以優雅地排空佇列。管理員也可以啟動已停止的佇列。

  • 基於資源的排程 - 支援資源密集型應用程式,其中應用程式可以選擇性地指定高於預設值的資源需求,從而容納具有不同資源需求的應用程式。目前,記憶體是支援的資源需求。

  • 基於預設或使用者定義配置規則的佇列對應介面 - 此功能允許使用者根據一些預設配置規則將工作對應至特定佇列。例如,根據使用者和群組,或應用程式名稱。使用者也可以定義自己的配置規則。

  • 優先順序排程 - 此功能允許提交應用程式並以不同的優先順序排程。較高的整數值表示應用程式的優先順序較高。目前,僅 FIFO 排序政策支援應用程式優先順序。

  • 絕對資源設定 - 管理員可以指定絕對資源給佇列,而不是提供基於百分比的值。這讓管理員可以更好地控制為特定佇列設定所需的資源數量。

  • 動態自動建立和管理葉子佇列 - 此功能支援自動建立葉子佇列,並結合佇列對應,目前支援基於使用者群組的佇列對應,以將應用程式配置到佇列。排程器也支援根據父佇列上設定的政策,為這些佇列進行容量管理。

設定

設定 ResourceManager 使用 CapacityScheduler

若要設定 ResourceManager 使用 CapacityScheduler,請在 conf/yarn-site.xml 中設定下列屬性

屬性
yarn.resourcemanager.scheduler.class org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler

設定佇列

etc/hadoop/capacity-scheduler.xmlCapacityScheduler 的設定檔。

CapacityScheduler 有預先定義的佇列,稱為 root。系統中的所有佇列都是 root 佇列的子佇列。

可以透過設定 yarn.scheduler.capacity.root.queues,並提供逗號分隔的子佇列清單,來設定其他佇列。

CapacityScheduler 的設定使用稱為佇列路徑的概念來設定佇列階層。佇列路徑是佇列階層的完整路徑,從 root 開始,並以 . (點) 作為分隔符號。

特定佇列的子佇列可以使用設定旋鈕來定義:yarn.scheduler.capacity.<queue-path>.queues。除非另有說明,否則子佇列不會直接繼承父佇列的屬性。

以下是一個範例,其中有三個頂層子佇列 abc,以及 ab 的一些子佇列

<property>
  <name>yarn.scheduler.capacity.root.queues</name>
  <value>a,b,c</value>
  <description>The queues at the this level (root is the root queue).
  </description>
</property>

<property>
  <name>yarn.scheduler.capacity.root.a.queues</name>
  <value>a1,a2</value>
  <description>The queues at the this level (root is the root queue).
  </description>
</property>

<property>
  <name>yarn.scheduler.capacity.root.b.queues</name>
  <value>b1,b2,b3</value>
  <description>The queues at the this level (root is the root queue).
  </description>
</property>

佇列屬性

  • 資源配置
屬性 說明
yarn.scheduler.capacity.<queue-path>.capacity 佇列容量,以百分比 (%) 表示為浮點數 (例如 12.5) 或絕對資源佇列最小容量。在每個層級中,所有佇列容量的總和必須等於 100。但是,如果設定絕對資源,則子佇列的絕對資源總和可能低於其父佇列的絕對資源容量。如果還有可用資源,佇列中的應用程式可能會消耗大於佇列容量的資源,提供彈性。
yarn.scheduler.capacity.<queue-path>.maximum-capacity 最大佇列容量,以百分比 (%) 表示為浮點數或絕對資源佇列最大容量。這會限制佇列中應用程式的彈性。1) 值介於 0 到 100 之間。2) 管理員需要確保每個佇列的絕對最大容量 >= 絕對容量。此外,將此值設定為 -1 會將最大容量設定為 100%。
yarn.scheduler.capacity.<queue-path>.minimum-user-limit-percent 如果資源有需求,每個佇列會強制限制分配給使用者的資源百分比。使用者限制可以在最小值和最大值之間變動。前者(最小值)設定為此屬性值,而後者(最大值)則取決於已提交應用程式的使用者數量。例如,假設此屬性的值為 25。如果兩個使用者已提交應用程式到佇列,則沒有任何單一使用者可以使用超過佇列資源的 50%。如果第三個使用者提交應用程式,則沒有任何單一使用者可以使用超過佇列資源的 33%。如果有 4 個或更多使用者,則沒有任何使用者可以使用超過佇列資源的 25%。值 100 表示不實施任何使用者限制。預設值為 100。值指定為整數。
yarn.scheduler.capacity.<queue-path>.user-limit-factor 可以設定佇列容量的倍數,以允許單一使用者取得更多資源。預設設定為 1,這可確保單一使用者永遠無法取得超過佇列設定的容量,無論叢集閒置程度如何。值指定為浮點數。
yarn.scheduler.capacity.<queue-path>.maximum-allocation-mb 每個佇列在資源管理員中分配給每個容器要求的記憶體最大限制。此設定會覆寫叢集設定 yarn.scheduler.maximum-allocation-mb。此值必須小於或等於叢集最大值。
yarn.scheduler.capacity.<queue-path>.maximum-allocation-vcores 每個佇列在資源管理員中分配給每個容器要求的虛擬核心最大限制。此設定會覆寫叢集設定 yarn.scheduler.maximum-allocation-vcores。此值必須小於或等於叢集最大值。
yarn.scheduler.capacity.<queue-path>.user-settings.<user-name>.weight 在計算佇列中使用者的使用者限制資源值時,會使用此浮點數值。此值會讓每個使用者比佇列中的其他使用者權重更高或更低。例如,如果使用者 A 應該在佇列中收到比使用者 B 和 C 多 50% 的資源,則此屬性會針對使用者 A 設定為 1.5。使用者 B 和 C 的預設值為 1.0。
  • 使用絕對資源設定進行資源配置

CapacityScheduler 支援設定絕對資源,而不是提供佇列以百分比表示的容量。如上方的設定區段中 yarn.scheduler.capacity.<queue-path>.capacityyarn.scheduler.capacity.<queue-path>.max-capacity 所述,管理員可以指定絕對資源值,例如 [memory=10240,vcores=12]。這是一個有效的設定,表示 10GB 記憶體和 12 個虛擬核心。

  • 執行中和待處理應用程式限制

CapacityScheduler 支援下列參數,用於控制執行中和待處理的應用程式

屬性 說明
yarn.scheduler.capacity.maximum-applications / yarn.scheduler.capacity.<queue-path>.maximum-applications 系統中可以同時處於執行中和待處理狀態的應用程式最大數量。各個佇列的限制與其佇列容量和使用者限制成正比。這是一個硬限制,當達到此限制時,提交的任何應用程式都會遭到拒絕。預設為 10000。這可以使用 yarn.scheduler.capacity.maximum-applications 設定所有佇列,也可以透過設定 yarn.scheduler.capacity.<queue-path>.maximum-applications 來針對每個佇列個別覆寫。預期為整數值。
yarn.scheduler.capacity.maximum-am-resource-percent / yarn.scheduler.capacity.<queue-path>.maximum-am-resource-percent 叢集中可使用於執行應用程式主控項的資源最大百分比 - 控制同時執行中應用程式的數量。各個佇列的限制與其佇列容量和使用者限制成正比。指定為浮點數 - 例如 0.5 = 50%。預設為 10%。這可以使用 yarn.scheduler.capacity.maximum-am-resource-percent 設定所有佇列,也可以透過設定 yarn.scheduler.capacity.<queue-path>.maximum-am-resource-percent 來針對每個佇列個別覆寫。
yarn.scheduler.capacity.max-parallel-apps / yarn.scheduler.capacity.<queue-path>.max-parallel-apps 可以同時執行的應用程式最大數量。與 maximum-applications 不同,達到此限制時不會拒絕應用程式提交。它們會停留在 ACCEPTED 狀態,直到符合執行資格。這可以使用 yarn.scheduler.capacity.max-parallel-apps 設定所有佇列,也可以透過設定 yarn.scheduler.capacity.<queue-path>.max-parallel-apps 來針對每個佇列個別覆寫。預期為整數值。預設沒有限制。並行應用程式最大限制是佇列階層中的繼承屬性,表示將選取最低值作為階層中每個分支的強制限制。

您也可以針對每個使用者限制並行應用程式的數量。

屬性 說明
yarn.scheduler.capacity.user.max-parallel-apps 所有使用者可以同時執行的應用程式最大數量。預設值為無限。
yarn.scheduler.capacity.user.<username>.max-parallel-apps 特定使用者可以同時執行的應用程式最大數量。這會覆寫全域設定。

這些限制的評估會按照下列順序執行

  1. maximum-applications 檢查 - 如果超過限制,提交會立即遭到拒絕。

  2. max-parallel-apps 檢查 - 提交會被接受,但應用程式不會轉換為 RUNNING 狀態。它會停留在 ACCEPTED 狀態,直到佇列/使用者限制得到滿足。

  3. maximum-am-resource-percent 檢查 - 如果有太多正在執行的應用程式主控程式,應用程式會停留在 ACCEPTED 狀態,直到有足夠的空間為它執行。

  • 佇列管理與權限

CapacityScheduler 支援下列參數來管理佇列

屬性 說明
yarn.scheduler.capacity.<queue-path>.state 佇列的狀態。可以是 RUNNINGSTOPPED 之一。如果佇列處於 STOPPED 狀態,則無法向本身任何子佇列提交新的應用程式。因此,如果佇列為 STOPPED,則無法向整個叢集提交應用程式。現有的應用程式會繼續完成,因此佇列可以優雅地耗盡。值指定為列舉。
yarn.scheduler.capacity.root.<queue-path>.acl_submit_applications 控制誰可以向特定佇列提交應用程式的ACL。如果特定使用者/群組對特定佇列或階層中的一個父佇列具有必要的 ACL,則他們可以提交應用程式。如果未指定,此屬性的ACL從父佇列繼承。如果在此清單中的使用者名稱前面加上波浪號 (~),則真實使用者的 ACL 會允許代理使用者提交至佇列。
yarn.scheduler.capacity.root.<queue-path>.acl_administer_queue 控制誰可以管理特定佇列上應用程式的ACL。如果特定使用者/群組對特定佇列或階層中的一個父佇列具有必要的 ACL,則他們可以管理應用程式。如果未指定,此屬性的ACL從父佇列繼承。如果在此清單中的使用者名稱前面加上波浪號 (~),則真實使用者的 ACL 會允許代理使用者管理佇列中的應用程式。

注意:ACL 的格式為 user1,user2 space group1,group2。特殊值 * 表示任何人。特殊值 space 表示無人。如果未指定,根佇列的預設值為 *。

  • 基於使用者或群組、應用程式名稱或使用者定義的配置規則的佇列對應

CapacityScheduler 支援下列參數,以根據使用者或群組、使用者和群組或應用程式名稱設定佇列對應。

屬性 說明
yarn.scheduler.capacity.queue-mappings 此設定指定使用者或群組對應到特定佇列。你可以將單一使用者或使用者清單對應到佇列。語法:[u or g]:[name]:[queue_name][,next_mapping]*。其中,u or g 指出對應是針對使用者或群組。值為 u 表示使用者,g 表示群組。name 指出使用者名稱或群組名稱。若要指定提交應用程式的使用者,可以使用 %user。queue_name 指出應用程式必須對應到的佇列名稱。若要指定與使用者名稱相同的佇列名稱,可以使用 %user。若要指定與使用者所屬主要群組名稱相同的佇列名稱,可以使用 %primary_group。次要群組可以參考為 %secondary_group
yarn.scheduler.queue-placement-rules.app-name 此設定指定 application_name 對應到特定佇列。你可以將單一應用程式或應用程式清單對應到佇列。語法:[app_name]:[queue_name][,next_mapping]*。其中,app_name 指出你想要對應的應用程式名稱。queue_name 指出應用程式必須對應到的佇列名稱。若要指定目前的應用程式名稱作為 app_name,可以使用 %application。
yarn.scheduler.capacity.queue-mappings-override.enable 此功能用於指定是否可以覆寫使用者指定的佇列。這是一個布林值,預設值為 false

範例

以下範例分別涵蓋單一對應。對於以逗號分隔值表示的多重對應,評估將從左到右進行,且將使用第一個有效的對應。以下範例順序已根據多重對應時在執行時期的實際執行順序編寫。

 <property>
    <name>yarn.scheduler.capacity.queue-mappings</name>
    <value>u:%user:%primary_group.%user</value>
    <description>Maps users to queue with the same name as user but
    parent queue name should be same as primary group of the user</description>
 </property>
 ...
 <property>
    <name>yarn.scheduler.capacity.queue-mappings</name>
    <value>u:%user:%secondary_group.%user</value>
    <description>Maps users to queue with the same name as user but
    parent queue name should be same as any secondary group of the user</description>
 </property>
 ...
 <property>
    <name>yarn.scheduler.capacity.queue-mappings</name>
    <value>u:%user:%user</value>
    <description>Maps users to queues with the same name as user</description>
 </property>
 ...
 <property>
    <name>yarn.scheduler.capacity.queue-mappings</name>
    <value>u:user2:%primary_group</value>
    <description>user2 is mapped to queue name same as primary group</description>
 </property>
 ...
 <property>
    <name>yarn.scheduler.capacity.queue-mappings</name>
    <value>u:user3:%secondary_group</value>
    <description>user3 is mapped to queue name same as secondary group</description>
 </property>
 ...
 <property>
    <name>yarn.scheduler.capacity.queue-mappings</name>
    <value>u:user1:queue1</value>
    <description>user1 is mapped to queue1</description>
 </property>
 ...
 <property>
    <name>yarn.scheduler.capacity.queue-mappings</name>
    <value>g:group1:queue2</value>
    <description>group1 is mapped to queue2</description>
 </property>
 ...
 <property>
    <name>yarn.scheduler.capacity.queue-mappings</name>
    <value>u:user1:queue1,u:user2:queue2</value>
    <description>Here, <user1> is mapped to <queue1>, <user2> is mapped to <queue2> respectively</description>
 </property>

  <property>
    <name>yarn.scheduler.queue-placement-rules.app-name</name>
    <value>appName1:queue1,%application:%application</value>
    <description>
      Here, <appName1> is mapped to <queue1>, maps applications to queues with
      the same name as application respectively. The mappings will be
      evaluated from left to right, and the first valid mapping will be used.
    </description>
  </property>
  • 應用程式的佇列生命週期

    CapacityScheduler 支援下列參數,以設定應用程式的生命週期

屬性 說明
yarn.scheduler.capacity.<queue-path>.maximum-application-lifetime 提交到佇列的應用程式最長生命週期(以秒為單位)。任何小於或等於零的值都將視為已停用。預設值為 -1。如果設定正值,則提交到此佇列的任何應用程式在超過設定的生命週期後都將被終止。使用者也可以在應用程式提交內容中指定每個應用程式的生命週期。但是,如果使用者生命週期超過佇列最長生命週期,則會覆寫使用者生命週期。這是即時設定。注意:此功能可以在佇列階層中的任何層級設定。子佇列會繼承其父佇列的值,除非在子層級覆寫。值 0 表示沒有最長生命週期,且會覆寫父佇列的最長生命週期。如果未設定此屬性或設定為負數,則此佇列的最長生命週期值會從其父佇列繼承。
yarn.scheduler.capacity.root.<queue-path>.default-application-lifetime 提交到佇列的應用程式的預設生命週期(秒)。任何小於或等於零的值都將被視為已停用。如果使用者未提交具有生命週期值的應用程式,則將採用此值。這是即時配置。此功能可以在佇列階層結構中的任何層級設定。子佇列會繼承其父佇列的值,除非在子層級中覆寫。如果設定為小於或等於 0,則佇列的最大值也必須是無限的。預設生命週期不能超過最大生命週期。

應用程式優先順序設定。

應用程式優先順序僅與 FIFO 排序原則搭配使用。預設排序原則為 FIFO。

應用程式的預設優先順序可以在叢集層級和佇列層級設定。

  • 叢集層級優先順序:任何提交的應用程式優先順序大於叢集最大優先順序,其優先順序將重設為叢集最大優先順序。$HADOOP_HOME/etc/hadoop/yarn-site.xml 是叢集最大優先順序的設定檔。
屬性 說明
yarn.cluster.max-application-priority 定義叢集中的最大應用程式優先順序。
  • 葉狀佇列層級優先順序:每個葉狀佇列由管理員提供預設優先順序。佇列的預設優先順序將用於任何未指定優先順序的提交應用程式。$HADOOP_HOME/etc/hadoop/capacity-scheduler.xml 是佇列層級優先順序的設定檔。
屬性 說明
yarn.scheduler.capacity.root.<leaf-queue-path>.default-application-priority 定義葉狀佇列中的預設應用程式優先順序。

注意:當應用程式移至不同的佇列時,應用程式的優先順序不會改變。

Capacity Scheduler 容器搶佔

CapacityScheduler 支援搶佔資源使用量大於其保證容量的佇列中的容器。必須在 yarn-site.xml 中啟用以下設定參數,才能支援應用程式容器的搶佔。

屬性 說明
yarn.resourcemanager.scheduler.monitor.enable 啟用一組會影響排程器的定期監視器(在 yarn.resourcemanager.scheduler.monitor.policies 中指定)。預設值為 false。
yarn.resourcemanager.scheduler.monitor.policies 與排程器互動的 SchedulingEditPolicy 類別清單。已設定的原則必須與排程器相容。預設值為 org.apache.hadoop.yarn.server.resourcemanager.monitor.capacity.ProportionalCapacityPreemptionPolicy,與 CapacityScheduler 相容

ProportionalCapacityPreemptionPolicy 類別已設定為 yarn.resourcemanager.scheduler.monitor.policies 時,可以在 yarn-site.xml 中設定以下設定參數來控制容器的搶佔

屬性 說明
yarn.resourcemanager.monitor.capacity.preemption.observe_only 若為 true,執行政策但不要影響具有搶先權和終止事件的叢集。預設值為 false
yarn.resourcemanager.monitor.capacity.preemption.monitoring_interval 呼叫此 ProportionalCapacityPreemptionPolicy 政策之間的時間(以毫秒為單位)。預設值為 3000
yarn.resourcemanager.monitor.capacity.preemption.max_wait_before_kill 從應用程式要求搶先權到終止容器之間的時間(以毫秒為單位)。預設值為 15000
yarn.resourcemanager.monitor.capacity.preemption.total_preemption_per_round 單一輪次中搶先權資源的最大百分比。透過控制此值,可以控制從叢集中回收容器的速度。在計算出所需的總搶先權後,政策會在此限制內縮小規模。預設值為 0.1
yarn.resourcemanager.monitor.capacity.preemption.max_ignored_over_capacity 超過目標容量的最大資源量,忽略搶先權。這定義了目標容量周圍的死區,有助於防止在計算出的目標平衡周圍發生抖動和震盪。高值會減慢達到容量的時間,而且(在沒有自然完成的情況下)可能會阻止收斂到保證的容量。預設值為 0.1
yarn.resourcemanager.monitor.capacity.preemption.natural_termination_factor 針對計算出的搶先權目標,考量自然過期的容器,並僅搶先權此百分比的增量。這會決定進入死區(MAX_IGNORED_OVER_CAPACITY)的幾何收斂率。例如,終止係數為 0.5 將在 5 * #WAIT_TIME_BEFORE_KILL 內回收幾乎 95% 的資源,即使沒有自然終止。預設值為 0.2

CapacityScheduler 支援 capacity-scheduler.xml 中的下列組態,以控制提交至佇列的應用程式容器的搶先權。

屬性 說明
yarn.scheduler.capacity.<queue-path>.disable_preemption 這個設定可以設為 true 以選擇性停用提交至特定佇列的應用程式容器的搶占。此屬性僅在透過將 yarn.resourcemanager.scheduler.monitor.enable 設定為 true 且將 yarn.resourcemanager.scheduler.monitor.policies 設定為 ProportionalCapacityPreemptionPolicy 來啟用系統範圍搶占時才套用。如果未針對佇列設定此屬性,則屬性值會從佇列的父項繼承。預設值為 false。
yarn.scheduler.capacity.<queue-path>.intra-queue-preemption.disable_preemption 這個設定可以設為 true 以選擇性停用提交至特定佇列的應用程式容器的佇列內搶占。此屬性僅在透過將 yarn.resourcemanager.scheduler.monitor.enable 設定為 true、將 yarn.resourcemanager.scheduler.monitor.policies 設定為 ProportionalCapacityPreemptionPolicy 以及將 yarn.resourcemanager.monitor.capacity.preemption.intra-queue-preemption.enabled 設定為 true 來啟用系統範圍搶占時才套用。如果未針對佇列設定此屬性,則屬性值會從佇列的父項繼承。預設值為 false

保留權限

  • 保留管理與權限

CapacityScheduler 支援下列參數來控制保留的建立、刪除、更新和列示。請注意,任何使用者都可以更新、刪除或列示自己的保留。如果保留 ACL 已啟用但未定義,則每個人都可以存取。在下列範例中,<queue> 是佇列名稱。例如,若要將保留 ACL 設為管理預設佇列的保留,請使用屬性 yarn.scheduler.capacity.root.default.acl_administer_reservations

屬性 說明
yarn.scheduler.capacity.root.<queue>.acl_administer_reservations 控制誰可以管理給定佇列的保留的 ACL。如果給定的使用者/群組在給定的佇列上擁有必要的 ACL,或者他們可以提交、刪除、更新和列示所有保留。如果未指定,此屬性的 ACL 不會從父佇列繼承。
yarn.scheduler.capacity.root.<queue>.acl_list_reservations 控制誰可以列示給定佇列的保留的 ACL。如果給定的使用者/群組在給定的佇列上擁有必要的 ACL,他們可以列示所有應用程式。如果未指定,此屬性的 ACL 不會從父佇列繼承。
yarn.scheduler.capacity.root.<queue>.acl_submit_reservations 控制誰可以提交給定佇列的保留的 ACL。如果給定的使用者/群組在給定的佇列上擁有必要的 ACL,他們可以提交保留。如果未指定,此屬性的 ACL 不會從父佇列繼承。

使用 CapacityScheduler 設定 ReservationSystem

CapacityScheduler 支援 ReservationSystem,允許使用者預先保留資源。應用程式可以在執行時間透過在提交期間指定 reservationId 來要求保留的資源。下列設定參數可以在 yarn-site.xml 中針對 ReservationSystem 設定。

屬性 說明
yarn.resourcemanager.reservation-system.enable 必填參數:在ResourceManager中啟用ReservationSystem。預期布林值。預設值為false,亦即ReservationSystem預設未啟用。
yarn.resourcemanager.reservation-system.class 選填參數:ReservationSystem的類別名稱。預設值根據已設定的排程器挑選,亦即如果設定CapacityScheduler,則為CapacityReservationSystem
yarn.resourcemanager.reservation-system.plan.follower 選填參數:在計時器上執行的PlanFollower類別名稱,並將CapacitySchedulerPlan同步,反之亦然。預設值根據已設定的排程器挑選,亦即如果設定CapacityScheduler,則為CapacitySchedulerPlanFollower
yarn.resourcemanager.reservation-system.planfollower.time-step 選填參數:PlanFollower計時器的毫秒頻率。預期長整數值。預設值為1000

ReservationSystem已整合CapacityScheduler佇列層級,目前可為任何LeafQueue設定。CapacityScheduler支援下列參數來調整ReservationSystem

屬性 說明
yarn.scheduler.capacity.<queue-path>.reservable 必填參數:指示ReservationSystem佇列的資源可供使用者預訂。預期布林值。預設值為false,亦即預設未在LeafQueues中啟用預訂。
yarn.scheduler.capacity.<queue-path>.reservation-agent 選填參數:將用於決定ReservationAgent實作的類別名稱,它會嘗試將使用者的預訂要求放入Plan中。預設值為org.apache.hadoop.yarn.server.resourcemanager.reservation.planning.AlignedPlannerWithGreedy
yarn.scheduler.capacity.<queue-path>.reservation-move-on-expiry 選填參數,用於指定當關聯預訂到期時,ReservationSystem應將應用程式移至或終止至父可預訂佇列(在上方設定)。預期布林值。預設值為true,表示應用程式將移至可預訂佇列。
yarn.scheduler.capacity.<queue-path>.show-reservations-as-queues 選填參數,用於在排程器UI中顯示或隱藏預訂佇列。預期布林值。預設值為false,亦即將隱藏預訂佇列。
yarn.scheduler.capacity.<queue-path>.reservation-policy 選用參數:類別名稱,將用於決定實作 SharingPolicy 的方式,此實作會驗證新的保留是否不會違反任何不變式。預設值為 org.apache.hadoop.yarn.server.resourcemanager.reservation.CapacityOverTimePolicy
yarn.scheduler.capacity.<queue-path>.reservation-window 選用參數,表示 SharingPolicy 將驗證計畫中約束是否滿意的時間(毫秒)。預期為長整數值。預設值為一天。
yarn.scheduler.capacity.<queue-path>.instantaneous-max-capacity 選用參數:任何時間的最大容量(以百分比 (%) 表示的小數),SharingPolicy 允許單一使用者保留的容量。預設值為 1,即 100%。
yarn.scheduler.capacity.<queue-path>.average-capacity 選用參數:允許的平均容量,將在 ReservationWindow 中累加(以百分比 (%) 表示的小數),SharingPolicy 允許單一使用者保留的容量。預設值為 1,即 100%。
yarn.scheduler.capacity.<queue-path>.reservation-planner 選用參數:類別名稱,將用於決定實作 Planner 的方式,如果 Plan 容量低於(由於預定維護或節點故障)使用者保留的資源,則會呼叫此實作。預設值為 org.apache.hadoop.yarn.server.resourcemanager.reservation.planning.SimpleCapacityReplanner,它會掃描 Plan 並以相反接受順序(LIFO)貪婪地移除保留,直到保留的資源在 Plan 容量內
yarn.scheduler.capacity.<queue-path>.reservation-enforcement-window 選用參數,表示 Planner 將驗證計畫中約束是否滿意的時間(毫秒)。預期為長整數值。預設值為一小時。

動態自動建立和管理葉子佇列

CapacityScheduler 支援在已設定啟用此功能的父佇列下自動建立葉子佇列

  • 透過佇列對應設定動態自動建立的葉子佇列

yarn.scheduler.capacity.queue-mappings 中列出的使用者群組佇列對應需要指定額外的父佇列參數,以識別自動建立的葉子佇列需要在哪些父佇列下建立。請參閱上方 根據使用者或群組的佇列對應 區段,以取得更多詳細資料。請注意,此類父佇列也需要啟用自動建立子佇列,如下方 父佇列設定,用於動態建立和管理葉子佇列 區段所述

範例

 <property>
   <name>yarn.scheduler.capacity.queue-mappings</name>
   <value>u:user1:queue1,g:group1:queue2,u:user2:%primary_group,u:%user:parent1.%user</value>
   <description>
     Here, u:%user:parent1.%user mapping allows any <user> other than user1,
     user2 to be mapped to its own user specific leaf queue which
     will be auto-created under <parent1>.
   </description>
 </property>
  • 父佇列設定,用於動態建立和管理葉子佇列

動態佇列自動建立和管理功能與 CapacityScheduler 佇列層級整合,目前可設定為自動建立子佇列的 ParentQueue。此類父佇列不支援與自動建立佇列同時存在的其他預先設定佇列。CapacityScheduler 支援下列參數以啟用佇列自動建立

屬性 說明
yarn.scheduler.capacity.<queue-path>.auto-create-child-queue.enabled 必要參數:指示 CapacityScheduler 需要為指定的父佇列啟用自動子佇列建立。預期布林值。預設值為 false,亦即預設情況下不會在 ParentQueue 中啟用自動子佇列建立。
yarn.scheduler.capacity.<queue-path>.auto-create-child-queue.management-policy 選用參數:將用於決定 AutoCreatedQueueManagementPolicy 實作的類別名稱,此實作將動態管理此父佇列下的子佇列及其容量。預設值為 org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.queuemanagement.GuaranteedOrZeroCapacityOverTimePolicy。使用者或群組可能會在有限的時間內將應用程式提交至自動建立的子佇列,然後停止使用這些應用程式。因此,在父佇列下自動建立的子佇列數量可能會多於其保證容量。目前的政策實作會根據父佇列的容量可用性和子佇列的應用程式提交順序,在 盡力而為 的基礎上分配設定的容量或零容量。
  • 使用 CapacityScheduler 設定 自動建立的子佇列

已啟用自動子佇列建立的父佇列,支援設定自動建立的子佇列的自動設定範本參數。自動建立的佇列支援所有子佇列設定參數,但 佇列 ACL絕對資源 設定除外。佇列 ACL 目前從父佇列繼承,亦即無法在子佇列範本上設定

屬性 說明
yarn.scheduler.capacity.<queue-path>.leaf-queue-template.capacity 必要參數:指定自動建立的子佇列的最低保證容量。目前在自動建立的子佇列上不支援 絕對資源 設定
yarn.scheduler.capacity.<queue-path>.leaf-queue-template.<leaf-queue-property> 選用參數:對於其他可在自動建立的葉子佇列中設定的佇列參數,例如最大容量、使用者限制因子、最大 AM 資源百分比… - 參閱佇列屬性區段

範例

 <property>
   <name>yarn.scheduler.capacity.root.parent1.auto-create-child-queue.enabled</name>
   <value>true</value>
 </property>
 <property>
    <name>yarn.scheduler.capacity.root.parent1.leaf-queue-template.capacity</name>
    <value>5</value>
 </property>
 <property>
    <name>yarn.scheduler.capacity.root.parent1.leaf-queue-template.maximum-capacity</name>
    <value>100</value>
 </property>
 <property>
    <name>yarn.scheduler.capacity.root.parent1.leaf-queue-template.user-limit-factor</name>
    <value>3.0</value>
 </property>
 <property>
    <name>yarn.scheduler.capacity.root.parent1.leaf-queue-template.ordering-policy</name>
    <value>fair</value>
 </property>
 <property>
    <name>yarn.scheduler.capacity.root.parent1.GPU.capacity</name>
    <value>50</value>
 </property>
 <property>
     <name>yarn.scheduler.capacity.root.parent1.accessible-node-labels</name>
     <value>GPU,SSD</value>
   </property>
 <property>
     <name>yarn.scheduler.capacity.root.parent1.leaf-queue-template.accessible-node-labels</name>
     <value>GPU</value>
  </property>
 <property>
    <name>yarn.scheduler.capacity.root.parent1.leaf-queue-template.accessible-node-labels.GPU.capacity</name>
    <value>5</value>
 </property>
  • 排程編輯政策設定,用於自動建立的佇列管理

管理員需要將其他 org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.QueueManagementDynamicEditPolicy 排程編輯政策指定給目前的排程編輯政策清單,並在 yarn.resourcemanager.scheduler.monitor.policies 設定中以逗號分隔字串的方式表示。如需更多詳細資訊,請參閱上方的容量排程器容器搶佔區段

屬性 說明
yarn.resourcemanager.monitor.capacity.queue-management.monitoring-interval 呼叫此 QueueManagementDynamicEditPolicy 政策之間的毫秒數。預設值為 1500

其他屬性

  • 資源計算器
屬性 說明
yarn.scheduler.capacity.resource-calculator ResourceCalculator 實作,用於比較排程器中的資源。預設值,亦即 org.apache.hadoop.yarn.util.resource.DefaultResourceCalculator,在比較多維度資源(例如記憶體、CPU 等)時,只會使用記憶體,而 DominantResourceCalculator 則會使用主要資源。預期為 Java ResourceCalculator 類別名稱。
  • 資料區域性

容量排程器利用延遲排程來滿足工作區域性限制。區域性限制共有 3 個層級:節點區域、機架區域和關閉交換。排程器會計算在無法滿足區域性時錯失的機會數,並等待此計數達到臨界值,才會將區域性限制放寬至下一個層級。臨界值可在下列屬性中設定

屬性 說明
yarn.scheduler.capacity.node-locality-delay 錯失的排程機會數,在達到此數之後,CapacityScheduler 會嘗試排程機架區域容器。通常,這應設定為叢集中的節點數。預設值大約是設定為一個機架中的節點數,即 40。預期為正整數值。
yarn.scheduler.capacity.rack-locality-additional-delay 在 CapacityScheduler 嘗試排程關閉開關的容器後,比節點局部性延遲多出的額外錯失排程機會的數量。預設值設為 -1,在此情況下,指定關閉開關容器的錯失機會數量會根據公式 L * C / N 計算,其中 L 是資源要求中指定的位址(節點或機架)數量,C 是要求的容器數量,而 N 是叢集大小。

請注意,如果 YARN 是與檔案系統分開部署,則應停用此功能,因為局部性沒有意義。這可透過將 yarn.scheduler.capacity.node-locality-delay 設為 -1 來完成,在此情況下,會忽略要求的局部性限制。

  • 每個 NodeManager 心跳的容器配置

CapacityScheduler 支援下列參數,以控制每個 NodeManager 心跳中可以配置多少個容器。這些參數可透過 yarn rmadmin -refreshQueues 更新。

屬性 說明
yarn.scheduler.capacity.per-node-heartbeat.multiple-assignments-enabled 是否允許在一個 NodeManager 心跳中進行多個容器配置。預設為 true。
yarn.scheduler.capacity.per-node-heartbeat.maximum-container-assignments 如果 multiple-assignments-enabled 為 true,則為一個 NodeManager 心跳中可以配置的最大容器數量。預設值為 100,這會將每個心跳的容器配置最大數量限制為 100。將此值設為 -1 會停用此限制。
yarn.scheduler.capacity.per-node-heartbeat.maximum-offswitch-assignments 如果 multiple-assignments-enabled 為 true,則為一個 NodeManager 心跳中可以配置的最大關閉開關容器數量。預設值為 1,這表示只允許在一個心跳中進行一次關閉開關配置。

檢閱 CapacityScheduler 的組態

完成安裝和組態後,您可以從 Web UI 中啟動 YARN 叢集後檢閱它。

  • 以正常方式啟動 YARN 叢集。

  • 開啟 ResourceManager Web UI。

  • /scheduler 網頁應顯示個別佇列的資源使用量。

變更佇列組態

變更佇列/排程器屬性,以及新增/移除佇列,有兩種方式,透過檔案或透過 API。此行為可透過 yarn-site.xml 中的 yarn.scheduler.configuration.store.class 變更。可能的值包括:file,允許透過檔案修改屬性;memory,允許透過 API 修改屬性,但不會在重新啟動時保留變更;leveldb,允許透過 API 修改屬性,並將變更儲存在 leveldb 後端儲存體中;以及 zk,允許透過 API 修改屬性,並將變更儲存在 zookeeper 後端儲存體中。預設值為 file

透過檔案變更佇列組態

若要透過檔案編輯,您需要編輯 conf/capacity-scheduler.xml 並執行 yarn rmadmin -refreshQueues

$ vi $HADOOP_CONF_DIR/capacity-scheduler.xml
$ $HADOOP_YARN_HOME/bin/yarn rmadmin -refreshQueues

透過檔案刪除佇列

步驟 1:停止佇列

在刪除葉狀佇列之前,葉狀佇列不應有任何正在執行/待處理的應用程式,且必須透過變更 yarn.scheduler.capacity.<queue-path>.state 來停止。請參閱 [佇列管理與權限](CapacityScheduler.html#Queue Properties) 區段。在刪除父佇列之前,其所有子佇列不應有任何正在執行/待處理的應用程式,且必須停止。父佇列也需要停止

步驟 2:刪除佇列

從檔案中移除佇列組態,並如上所述執行更新

透過 API 變更佇列組態

透過 API 編輯會使用排程器組態的備份儲存。若要啟用此功能,可以在 yarn-site.xml 中組態下列參數。

注意:此功能處於 alpha 階段,可能會變更。

屬性 說明
yarn.scheduler.configuration.store.class 備份儲存的類型,如 上方 所述。
yarn.scheduler.configuration.mutation.acl-policy.class 可以組態 ACL 政策,以限制哪些使用者可以修改哪些佇列。預設值為 org.apache.hadoop.yarn.server.resourcemanager.scheduler.DefaultConfigurationMutationACLPolicy,它只允許 YARN 管理員進行任何組態修改。另一個值是 org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.conf.QueueAdminConfigurationMutationACLPolicy,它只允許呼叫者是佇列管理員時修改佇列。
yarn.scheduler.configuration.store.max-logs 組態變更會記錄在備份儲存的稽核記錄中,如果使用 leveldb 或 zookeeper。此組態控制要儲存的稽核記錄最大數量,超過時會捨棄最舊的記錄。預設值為 1000。
yarn.scheduler.configuration.leveldb-store.path 使用 leveldb 時,組態儲存的儲存路徑。預設值為 ${hadoop.tmp.dir}/yarn/system/confstore
yarn.scheduler.configuration.leveldb-store.compaction-interval-secs 使用 leveldb 時,壓縮組態儲存的間隔(以秒為單位)。預設值為 86400,即一天。
yarn.scheduler.configuration.zk-store.parent-path 使用 zookeeper 時,組態儲存相關資訊的 zookeeper 根節點路徑。預設值為 /confstore

注意:透過 yarn.scheduler.configuration.store.class 啟用排程器組態變更時,yarn rmadmin -refreshQueues 將會停用,也就是說將無法再透過檔案更新組態。

請參閱 YARN 資源管理員 REST API,以取得如何透過 REST 變更排程器組態的範例,以及 YARN 指令參考,以取得如何透過命令列變更排程器組態的範例。

更新容器(實驗性 - API 可能在未來變更)

應用程式主控程式從資源管理員收到容器後,它可能會要求資源管理員更新容器的特定屬性。

目前僅支援兩種類型的容器更新

  • 資源更新:AM 可以要求 RM 更新容器的資源大小。例如:將容器從 2GB、2 個 vcore 的容器變更為 4GB、2 個 vcore 的容器。
  • 執行類型更新:AM 可以要求 RM 更新容器的執行類型。例如:將執行類型從 GUARANTEED 變更為 OPPORTUNISTIC,反之亦然。

AM 透過填入 updated_containers 欄位來達成此目的,該欄位是 UpdateContainerRequestProto 類型的清單,位於 AllocateRequestProto 中。AM 可以同一次分配呼叫中提出多個容器更新要求。

UpdateContainerRequestProto 的架構如下

message UpdateContainerRequestProto {
  required int32 container_version = 1;
  required ContainerIdProto container_id = 2;
  required ContainerUpdateTypeProto update_type = 3;
  optional ResourceProto capability = 4;
  optional ExecutionTypeProto execution_type = 5;
}

ContainerUpdateTypeProto 是列舉

enum ContainerUpdateTypeProto {
  INCREASE_RESOURCE = 0;
  DECREASE_RESOURCE = 1;
  PROMOTE_EXECUTION_TYPE = 2;
  DEMOTE_EXECUTION_TYPE = 3;
}

受上述列舉約束,排程器目前支援在一個更新要求中變更容器的資源更新或執行類型。

AM 也必須提供從 RM 收到的最新 ContainerProto。這是 RM 將嘗試更新的容器。

如果 RM 能夠更新要求的容器,更新的容器將會在 AllocateResponseProto 回傳值中 updated_containers 清單欄位類型為 UpdatedContainerProto 的欄位中回傳,無論是在同一次分配呼叫中或後續呼叫中。

UpdatedContainerProto 的架構如下

message UpdatedContainerProto {
  required ContainerUpdateTypeProto update_type = 1;
  required ContainerProto container = 2;
}

它指定在容器上執行的容器更新類型,以及包含更新權杖的更新容器物件。

AM 然後可以使用容器權杖要求對應的 NM 啟動容器(如果容器尚未啟動)或使用更新權杖更新容器。

DECREASE_RESOURCEDEMOTE_EXECUTION_TYPE 容器更新是自動的 - AM 不必明確要求 NM 減少容器的資源。其他更新類型需要 AM 明確要求 NM 更新容器。

如果 yarn.resourcemanager.auto-update.containers 組態參數設為 true(預設為 false),RM 將確保所有容器更新都是自動的。

活動

排程活動是活動訊息,用於對某些關鍵排程路徑進行除錯,它們可以透過 RESTful API 記錄和公開,對排程器效能的影響很小。目前,支援兩種類型的活動:排程器活動應用程式活動

排程器活動

排程器活動包括排程週期中的有用排程資訊,說明排程器如何配置容器。排程器活動 REST API (http://rm-http-address:port/ws/v1/cluster/scheduler/activities) 提供一個方法來啟用排程器活動的記錄,並從快取中擷取它們。為了消除效能影響,排程器會在排程週期結束時自動停用記錄活動,您可以再次查詢 RESTful API 以取得最新的排程器活動。

請參閱 YARN 資源管理員 REST API,以取得關於排程器活動的查詢參數、輸出結構和範例。

應用程式活動

應用程式活動包括指定應用程式的有用排程資訊,說明需求如何獲得滿足或僅略過。應用程式活動 REST API (http://rm-http-address:port/ws/v1/cluster/scheduler/app-activities/{appid}) 提供一個方法來啟用記錄指定應用程式在幾秒鐘內的應用程式活動,或從快取中擷取歷史應用程式活動,可用的動作包括「更新」和「取得」,可透過「動作」參數指定

  • 使用參數「動作=更新」查詢將啟用記錄指定應用程式在特定時間(預設為 3 秒)內的應用程式活動,並取得類似下列的簡單回應:{“appActivities”:{“applicationId”:“application_1562308866454_0001”,“diagnostic”:“成功收到動作:更新”,“timestamp”:1562308869253,“dateTime”:“2019 年 7 月 5 日星期五下午 2:41:09 CST”}}。
  • 使用參數「動作=取得」查詢將不會啟用記錄,而是直接從快取中取得歷史應用程式活動。
  • 如果未指定動作參數,預設動作為「refresh,get」,表示將同時執行「refresh」和「get」。

請參閱 YARN 資源管理員 REST API,以取得有關應用程式活動的查詢參數、輸出結構和範例。

設定

CapacityScheduler 支援下列參數,以控制快取大小和排程器/應用程式活動的到期時間。

屬性 說明
yarn.resourcemanager.activities-manager.cleanup-interval-ms 活動的清理間隔(以毫秒為單位)。預設為 5000。
yarn.resourcemanager.activities-manager.scheduler-activities.ttl-ms 排程器活動的存活時間(以毫秒為單位)。預設為 600000。
yarn.resourcemanager.activities-manager.app-activities.ttl-ms 應用程式活動的存活時間(以毫秒為單位)。預設為 600000。
yarn.resourcemanager.activities-manager.app-activities.max-queue-length 應用程式活動的最大佇列長度。預設為 100。

Web UI

活動資訊可在 RM Web UI 上的應用程式嘗試頁面中取得,其中會彙總並顯示未完成的請求。只要按一下重新整理按鈕,即可取得最新的活動資訊。