YARN 節點標籤

概觀

節點標籤是一種將具有類似特徵的節點分組,且應用程式可以指定執行位置的方式。

目前我們僅支援節點分割,如下所示:

  • 一個節點只能有一個節點分割,因此一個叢集會透過節點分割分割成數個不相交的子叢集。預設情況下,節點屬於 DEFAULT 分割 (分割="")
  • 使用者需要設定每個分割的資源有多少可以供不同的佇列使用。如需更多詳細資訊,請參閱下一部分。
  • 有兩種節點分割
    • 獨佔:容器將配置到與節點分區完全匹配的節點。(例如:要求分區 =“x”將配置到分區 =“x”的節點,要求 DEFAULT 分區將配置到 DEFAULT 分區節點)。
    • 非獨佔:如果分區是非獨佔的,它會與要求 DEFAULT 分區的容器共用閒置資源。

使用者可以指定每個佇列可以存取的節點標籤組,一個應用程式只能使用包含該應用程式的佇列可以存取的節點標籤子集。

功能

節點標籤目前支援下列功能

  • 分區叢集 - 每個節點可以指定一個標籤,因此叢集將被分割成幾個較小的不相交分區。
  • 佇列上節點標籤的 ACL - 使用者可以在每個佇列上設定可存取的節點標籤,因此只有特定佇列才能存取某些節點。
  • 指定佇列可以存取的分區資源百分比 - 使用者可以設定百分比,例如:佇列 A 可以存取標籤 = hbase 的節點上 30% 的資源。此類百分比設定將與現有的資源管理員一致
  • 在資源要求中指定所需的節點標籤,只有當節點具有相同標籤時才會配置。如果未指定節點標籤需求,此類資源要求將只配置在屬於 DEFAULT 分區的節點上。
  • 可操作性
    • 節點標籤和節點標籤對應可以在 RM 重新啟動時復原
    • 更新節點標籤 - 管理員可以在 RM 執行時更新節點上的標籤和佇列上的標籤
  • NM 到節點標籤的對應可以用三種方式完成,但在所有方法中,分區標籤應為 RM 中設定的有效節點標籤清單之一。
    • 集中式:節點到標籤的對應可以透過 RM 公開的 CLI、REST 或 RPC 完成。
    • 分散式:節點對標籤的對應將由 NM 中設定的節點標籤提供者設定。YARN 中有兩種不同的提供者:基於 腳本 的提供者和基於 設定檔 的提供者。如果是腳本,則可設定 NM 的腳本路徑,而腳本可以發出節點的標籤。如果是設定檔,則可直接在 NM 的 yarn-site.xml 中設定節點標籤。這兩個選項都支援動態更新標籤對應。
    • 委派式集中式:節點對標籤的對應將由 RM 中設定的節點標籤提供者設定。如果由於安全性疑慮,各節點無法提供標籤對應,而大型叢集中的每個節點又無法透過 RM 介面進行互動,則此方法會很有用。標籤會在 NM 註冊期間從此介面擷取,並且也支援定期更新。

設定

設定 ResourceManager 以啟用節點標籤

yarn-site.xml 中設定下列屬性

屬性
yarn.node-labels.fs-store.root-dir hdfs://namenode:port/path/to/store/node-labels/
yarn.node-labels.enabled true
yarn.node-labels.configuration-type 設定節點標籤的設定檔類型。管理員可以指定「集中式」、「委派式集中式」或「分散式」。預設值為「集中式」。

注意事項

  • 請確定已建立 yarn.node-labels.fs-store.root-dir,且 ResourceManager 有權限存取它。(通常來自「yarn」使用者)
  • 如果使用者想將節點標籤儲存在 RM 的本機檔案系統(而非 HDFS),則可以使用類似 file:///home/yarn/node-label 的路徑

將節點標籤清單新增/修改至 YARN

  • 新增叢集節點標籤清單
    • 執行 yarn rmadmin -addToClusterNodeLabels "label_1(exclusive=true/false),label_2(exclusive=true/false)" 以新增節點標籤。
    • 如果使用者未指定「(exclusive=…)」,則預設 exclusive 會為 true
    • 執行 yarn cluster --list-node-labels 以檢查已新增的節點標籤是否在叢集中可見。

從 YARN 中移除節點標籤

  • 移除叢集節點標籤
    • 若要移除一個或多個節點標籤,請執行下列指令:yarn rmadmin -removeFromClusterNodeLabels "<label>[,<label>,...]"。指令引數應為要移除的節點標籤的逗號分隔清單。
    • 不允許移除已與佇列關聯的標籤,亦即一個或多個佇列有權存取此標籤。
    • 若要驗證指定的節點標籤是否已成功移除,請執行 yarn cluster --list-node-labels

將節點對應至標籤的對應新增/修改至 YARN

  • 集中式 NodeLabel 設定中設定節點對應至標籤的對應

    • 執行 yarn rmadmin -replaceLabelsOnNode “node1[:port]=label1 node2=label2” [-failOnUnknownNodes]。將 label1 新增至 node1,將 label2 新增至 node2。如果使用者未指定埠,它會將標籤新增至在節點上執行的所有 NodeManagers。如果選項 -failOnUnknownNodes 已設定,則如果指定的節點不明,此命令會失敗。
  • 分散式 NodeLabel 設定中設定節點對應至標籤的對應

屬性
yarn.node-labels.configuration-type 需要在 RM 中設定為 “distributed”,才能從 NM 中設定的 Node 標籤提供者取得節點對應至標籤的對應。
yarn.nodemanager.node-labels.provider “yarn.node-labels.configuration-type” 在 RM 中設定為 “distributed” 時,管理員可以透過在 NM 中設定此參數來設定節點標籤的提供者。管理員可以設定提供者的 “config”“script”類別名稱。設定的類別需要延伸 org.apache.hadoop.yarn.server.nodemanager.nodelabels.NodeLabelsProvider。如果設定 “config”,則會使用 “ConfigurationNodeLabelsProvider”,如果設定 “script”,則會使用 “ScriptNodeLabelsProvider”
yarn.nodemanager.node-labels.resync-interval-ms NM 與 RM 同步其節點標籤的間隔。NM 會每隔 x 個設定的間隔傳送其載入的標籤,以及心跳至 RM。即使標籤未修改,此重新同步仍是必要的,因為管理員可能會移除 NM 提供的叢集標籤。預設為 2 分鐘。
yarn.nodemanager.node-labels.provider.fetch-interval-ms “yarn.nodemanager.node-labels.provider” 設定為 “config”“script”設定的類別 延伸 AbstractNodeLabelsProvider 時,會定期從節點標籤提供者擷取節點標籤。此設定用於定義間隔時間。如果設定為 -1,則僅會在初始化期間從提供者擷取節點標籤。預設為 10 分鐘。
yarn.nodemanager.node-labels.provider.fetch-timeout-ms “yarn.nodemanager.node-labels.provider” 設定為 “script” 時,此設定會提供中斷查詢節點標籤的指令碼的逾時時間。預設為 20 分鐘。
yarn.nodemanager.node-labels.provider.script.path 要執行的節點標籤指令碼。以「NODE_PARTITION:」開頭的指令碼輸出列會被視為節點標籤區段。如果指令碼輸出有多列符合此模式,則會採用最後一列。
yarn.nodemanager.node-labels.provider.script.opts 傳遞給節點標籤指令碼的參數。
yarn.nodemanager.node-labels.provider.configured-node-partition 如果「yarn.nodemanager.node-labels.provider」設定為「config」,則 ConfigurationNodeLabelsProvider 會從此參數擷取區段標籤。
  • 委派式集中化節點標籤設定中設定節點對應標籤
屬性
yarn.node-labels.configuration-type 需要設定為「delegated-centralized」,才能從 RM 中設定的節點標籤提供者擷取節點對應標籤。
yarn.resourcemanager.node-labels.provider 如果「yarn.node-labels.configuration-type」設定為「delegated-centralized」,則管理員應設定類別,讓 ResourceManager 擷取節點標籤。設定的類別需要延伸 org.apache.hadoop.yarn.server.resourcemanager.nodelabels.RMNodeLabelsMappingProvider。
yarn.resourcemanager.node-labels.provider.fetch-interval-ms 如果「yarn.node-labels.configuration-type」設定為「delegated-centralized」,則會定期從節點標籤提供者擷取節點標籤。此設定用於定義間隔。如果設定為 -1,則在每個節點註冊後,只會從提供者擷取一次節點標籤。預設為 30 分鐘。

節點標籤的排程器設定

  • 容量排程器設定
屬性
yarn.scheduler.capacity.<queue-path>.capacity 設定佇列可以存取屬於預設區段的節點的百分比。每個父層底下直系子層的預設容量總和必須等於 100。
yarn.scheduler.capacity.<queue-path>.accessible-node-labels 管理員需要指定每個佇列可以存取的標籤,以逗號分隔,例如「hbase,storm」表示佇列可以存取標籤 hbase 和 storm。所有佇列都可以存取沒有標籤的節點,使用者不必特別指定。如果使用者未指定此欄位,則會繼承自其父層。如果使用者想要明確指定佇列只能存取沒有標籤的節點,只要將值設為空白即可。
yarn.scheduler.capacity.<佇列路徑>.accessible-node-labels.<標籤>.capacity 設定佇列可以存取屬於 <標籤> 分割區的節點的百分比。每個父層之下直接子層的 <標籤> 容量總和必須等於 100。預設為 0。
yarn.scheduler.capacity.<佇列路徑>.accessible-node-labels.<標籤>.maximum-capacity 類似於 yarn.scheduler.capacity.<佇列路徑>.maximum-capacity,它是每個佇列標籤的最大容量。預設為 100。
yarn.scheduler.capacity.<佇列路徑>.default-node-label-expression 值例如「hbase」,表示:如果提交至佇列的應用程式未在其資源要求中指定節點標籤,它將使用「hbase」作為 default-node-label-expression。預設為空值,因此應用程式將從沒有標籤的節點取得容器。

節點標籤設定範例:

假設我們有一個佇列結構

                root
            /     |    \
     engineer    sales  marketing

我們在叢集中有 5 個節點 (hostname=h1..h5),每個節點有 24G 記憶體、24 個 vcore。5 個節點中有一個有 GPU (假設是 h5)。因此管理員將 GPU 標籤新增至 h5。

假設使用者有一個類似下列的 Capacity Scheduler 設定:(為方便閱讀,使用 key=value)

yarn.scheduler.capacity.root.queues=engineering,marketing,sales
yarn.scheduler.capacity.root.engineering.capacity=33
yarn.scheduler.capacity.root.marketing.capacity=34
yarn.scheduler.capacity.root.sales.capacity=33

yarn.scheduler.capacity.root.engineering.accessible-node-labels=GPU
yarn.scheduler.capacity.root.marketing.accessible-node-labels=GPU

yarn.scheduler.capacity.root.engineering.accessible-node-labels.GPU.capacity=50
yarn.scheduler.capacity.root.marketing.accessible-node-labels.GPU.capacity=50

yarn.scheduler.capacity.root.engineering.default-node-label-expression=GPU

您可以看到 root.engineering/marketing/sales.capacity=33,因此每個佇列都可以有等於 沒有分割區資源 1/3 的保證資源。因此每個佇列可以使用 h1..h4 的 1/3 資源,也就是 24 * 4 * (1/3) = (32G 記憶體、32 個 vcore)。

而且只有 engineering/marketing 佇列有權限存取 GPU 分割區 (請參閱 root.<佇列名稱>.accessible-node-labels)。

每個 engineering/marketing 佇列都有等於 分割區=GPU 資源 1/2 的保證資源。因此每個佇列可以使用 h5 的 1/2 資源,也就是 24 * 0.5 = (12G 記憶體、12 個 vcore)。

注意事項

  • 完成 CapacityScheduler 設定後,執行 yarn rmadmin -refreshQueues 套用變更
  • 前往 RM 網頁 UI 的排程器頁面,檢查您是否已成功設定設定檔。

為應用程式指定節點標籤

應用程式可以使用下列 Java API 來指定要要求的節點標籤

  • ApplicationSubmissionContext.setNodeLabelExpression(..) 為應用程式的所有容器設定節點標籤表達式。
  • ResourceRequest.setNodeLabelExpression(..) 為個別資源要求設定節點標籤表達式。這會覆寫 ApplicationSubmissionContext 中設定的節點標籤表達式
  • ApplicationSubmissionContext 中指定 setAMContainerResourceRequest.setNodeLabelExpression,以指出應用程式主控端容器預期的節點標籤。

監控

透過網頁使用者介面監控

網頁使用者介面上可以看到下列標籤相關欄位

透過命令列監控

  • 使用 yarn cluster --list-node-labels 取得叢集中的標籤
  • 使用 yarn node -status <NodeId> 取得節點狀態,包括指定節點上的標籤

實用連結