節點標籤是一種將具有類似特徵的節點分組,且應用程式可以指定執行位置的方式。
目前我們僅支援節點分割,如下所示:
使用者可以指定每個佇列可以存取的節點標籤組,一個應用程式只能使用包含該應用程式的佇列可以存取的節點標籤子集。
節點標籤
目前支援下列功能
在 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」使用者)file:///home/yarn/node-label
的路徑yarn rmadmin -addToClusterNodeLabels "label_1(exclusive=true/false),label_2(exclusive=true/false)"
以新增節點標籤。true
。yarn cluster --list-node-labels
以檢查已新增的節點標籤是否在叢集中可見。yarn rmadmin -removeFromClusterNodeLabels "<label>[,<label>,...]"
。指令引數應為要移除的節點標籤的逗號分隔清單。yarn cluster --list-node-labels
。在 集中式 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)。
注意事項
yarn rmadmin -refreshQueues
套用變更應用程式可以使用下列 Java API 來指定要要求的節點標籤
ApplicationSubmissionContext.setNodeLabelExpression(..)
為應用程式的所有容器設定節點標籤表達式。ResourceRequest.setNodeLabelExpression(..)
為個別資源要求設定節點標籤表達式。這會覆寫 ApplicationSubmissionContext 中設定的節點標籤表達式ApplicationSubmissionContext
中指定 setAMContainerResourceRequest.setNodeLabelExpression
,以指出應用程式主控端容器預期的節點標籤。網頁使用者介面上可以看到下列標籤相關欄位
yarn cluster --list-node-labels
取得叢集中的標籤yarn node -status <NodeId>
取得節點狀態,包括指定節點上的標籤