YARN 節點的優雅停用

概觀

YARN 非常容易擴充:任何新的 NodeManager 都可以加入已設定的 ResourceManager 並開始執行工作。但要達成完全彈性,我們需要一個停用程序,有助於移除現有節點並縮小叢集規模。

YARN 節點可以正常或優雅地停用。

YARN 節點的正常停用表示立即關閉。

YARN 節點的優雅停用是停用 NM 的機制,同時將對正在執行的應用程式的影響降至最低。一旦節點進入 DECOMMISSIONING 狀態,RM 便不會在該節點上排程新的容器,並會等到正在執行的容器和應用程式完成(或直到停用逾時),才會將節點轉移至 DECOMMISSIONED。

快速入門

執行一般停用

  1. 啟動 YARN 群集(包含 NodeManager 和 ResourceManager)
  2. 啟動 yarn 工作(例如使用 yarn jar...
  3. yarn.resourcemanager.nodes.exclude-path 屬性新增至您的 yarn-site.xml(注意:您不需要重新啟動 ResourceManager)
  4. 建立一個文字檔(位置定義於前一個步驟),其中一行包含所選 NodeManager 的名稱
  5. 呼叫 ./bin/yarn rmadmin -refreshNodes
  6. 結果:NodeManager 會立即停用

在下一節中,我們將介紹一些更詳細的用法(例如:使用具有逾時功能的優雅停用)。

功能

根據排除/包含清單觸發停用/重新啟用

yarn rmadmin -refreshNodes [-g [以秒為單位的逾時] -client|server] 會通知 NodesListManager 偵測並處理包含和排除主機變更。NodesListManager 會從排除檔案載入已排除的主機,如 yarn-site.xml 中的 yarn.resourcemanager.nodes.exclude-path 設定所指定。(注意:變更排除路徑時不需要重新啟動 RM,因為每次 refreshNodes 指令都會重新讀取此設定)

檔案格式可以是純文字或 XML,視檔案的副檔名而定。只有 XML 格式支援針對每個節點的優雅停用逾時。

NodesListManager 會檢查並比較資源管理員中的 RMNodes 狀態和排除清單,並根據下列規則套用必要的動作

  • 重新啟用不再被排除的 DECOMMISSIONED 或 DECOMMISSIONING 節點;
  • 優雅地停用尚未處於 DECOMMISSIONED 或 DECOMMISSIONING 狀態的已排除節點;
  • 如果未指定 -g 旗標,則立即停用尚未處於 DECOMMISSIONED 狀態的已排除節點。

因此,會將 RECOMMISSION、GRACEFUL_DECOMMISSION 或 DECOMMISSION RMNodeEvent 傳送至 RMNode。

每個節點停用逾時支援

為了支援使用單一或多個 refreshNodes 要求透過不同逾時優雅地停用節點,HostsFileReader 支援在排除主機檔案中每個主機名稱(或 IP)之後提供選用的逾時值。

針對特定主機使用的有效停用逾時基於下列優先順序

如果發生伺服器端逾時

  1. 如果在排除主機檔案中指定,請使用特定主機的逾時;
  2. 如果指定,請使用 yarn rmadmin -refreshNodes -g [以秒為單位的逾時] -server|client 中的逾時;
  3. 使用透過 “yarn.resourcemanager.nodemanager-graceful-decommission-timeout-secs” 組態指定的預設逾時。

如果發生用戶端逾時(見下方)

  1. 只有 -g 旗標定義的命令列參數會被使用。

NodesListManager 決定要使用的有效逾時,並將其設定在個別 RMNode 上。逾時也可以透過 yarn rmadmin -refreshNodes -g [以秒為單位的逾時] 指令動態調整。NodesListManager 會解析要使用的有效逾時,並視需要更新 RMNode 的新逾時。逾時變更不會重設進行中的解除委派,只會影響評估節點是否已達到解除委派逾時。

以下是 xml 格式的範例排除檔案。

<?xml version="1.0"?>
<hosts>
  <host><name>host1</name></host>
  <host><name>host2</name><timeout>123</timeout></host>
  <host><name>host3</name><timeout>-1</timeout></host>
  <host><name>host4, host5,host6</name><timeout>1800</timeout></host>
</hosts>

如果排除檔案的副檔名不是 xml,則會使用標準的每行一個主機格式,不支援逾時。

host1
host2
host3

注意:未來計畫有更多支援逾時的檔案格式。如果您有興趣,請追蹤 YARN-5536

重要的是要注意,逾時不會持續存在。如果發生 RM 重新啟動/故障轉移,節點將會立即解除委派。(追蹤 YARN-5464 以了解此行為的變更)。

用戶端或伺服器端逾時

優雅解除委派的逾時可以在伺服器端或用戶端追蹤。-client|server 表示逾時追蹤應由用戶端或 ResourceManager 處理。用戶端追蹤會封鎖,而伺服器端追蹤則不會。

RMNode 處理解除委派事件

在收到 GRACEFUL_DECOMMISSION 事件時,RMNode 會儲存解除委派逾時(如果已指定),更新優雅解除委派的指標,並保留其原始總容量,並轉換為 DECOMMISSIONING 狀態。

資源會在 DECOMMISSIONING RMNode 上動態且定期更新,因此排程器不會在上面排程新的容器,因為沒有可用資源。

解除委派節點狀態的自動和非同步追蹤

DecommissioningNodeWatcher 是 YARN 組件,在客戶端/管理員提出正常解除委派要求後,會自動且非同步追蹤 DECOMMISSIONING 節點狀態。NM 會定期傳送 RM 心跳,並附上最新的容器狀態。DecommissioningNodeWatcher 會追蹤所有 DECOMMISSIONING 節點的心跳更新,以決定在節點上的所有執行中容器完成後,何時會轉換為 DECOMMISSIONED 狀態,並在轉換後通知 NodeManager 關閉。

在 MR 應用程式中,節點在完成所有容器後,可能仍會在應用程式期間提供其對應的輸出資料,供 reducer 使用。YARN 正常解除委派機制會保留此類 DECOMMISSIONING 節點,直到所有相關應用程式完成。然而,在長時間執行的應用程式場景中,這可能會造成許多「閒置」節點長時間存在,這是不理想的。DecommissioningNodeWatcher 會透過逾時平衡此類問題,無論執行中容器或應用程式如何,DECOMMISSIONING 節點都會在解除委派逾時之前解除委派。如果執行中容器較早完成,它會繼續等待應用程式完成,直到解除委派逾時。當解除委派逾時時,節點會不論如何解除委派。節點會停用,而擁有的工作會視需要重新排程。

所有解除委派節點的狀態會定期記錄在資源管理員記錄檔中(每 20 秒)。以下是解除委派節點的子狀態

  • NONE — 節點不在 DECOMMISSIONING 狀態。
  • WAIT_CONTAINER — 等待執行中容器完成。
  • WAIT_APP — 等待執行中應用程式完成(所有容器完成後)
  • TIMEOUT — 逾時等待容器或應用程式完成
  • READY — 無需等待,準備解除委派
  • DECOMMISSIONED — 節點已解除委派

組態

屬性
yarn.resourcemanager.nodemanager-graceful-decommission-timeout-secs YARN 節點正常解除委派逾時(秒)。這是將 DECOMMISSIONING 節點轉換為 DECOMMISSIONED 之前,等待執行中容器和應用程式完成的最長時間。預設值為 3600 秒。負值(例如 -1)會視為無限逾時。
yarn.resourcemanager.decommissioning-nodes-watcher.poll-interval-secs DecommissioningNodesWatcher 內部輪詢計時器工作執行週期(秒),用於識別和處理遺失定期心跳的 DECOMMISSIONING 節點。預設值為 20 秒。
yarn.resourcemanager.nodes.exclude-path 路徑指向包含要排除節點的文件。
yarn.resourcemanager.nodes.include-path 路徑指向包含要包含節點的文件。