NodeManager

概觀

NodeManager 負責在節點上啟動和管理容器。容器會執行 AppMaster 指定的任務。

健康檢查器服務

NodeManager 會執行服務來判斷其執行節點的健康狀況。這些服務會對磁碟執行檢查,以及任何使用者指定的測試。如果任何健康檢查失敗,NodeManager 會將節點標示為不健康,並將此狀態傳達給 ResourceManager,然後 ResourceManager 會停止將容器指派給該節點。節點狀態的傳達會在 NodeManager 和 ResourceManager 之間的心跳中進行。磁碟檢查器和健康監控器(如下所述)執行的間隔不會影響心跳間隔。當心跳發生時,會使用兩個檢查的狀態來判斷節點的健康狀況。

磁碟檢查器

磁碟檢查器會檢查 NodeManager 設定為使用之磁碟狀態(分別使用 yarn.nodemanager.local-dirs 和 yarn.nodemanager.log-dirs 設定的 local-dirs 和 log-dirs)。檢查包括權限和可用磁碟空間。它也會檢查檔案系統是否處於唯讀狀態。預設會每 2 分鐘執行一次檢查,但可以設定為依使用者需求執行檢查。如果磁碟檢查失敗,NodeManager 會停止使用該磁碟,但仍會回報節點狀態為正常。不過,如果多個磁碟檢查失敗(磁碟數量可以設定,如下所述),節點會回報給 ResourceManager 為不正常,而且不會將新容器指派給該節點。

可以使用下列設定參數來修改磁碟檢查

設定名稱 允許值 說明
yarn.nodemanager.disk-health-checker.enable true、false 啟用或停用磁碟健康檢查器服務
yarn.nodemanager.disk-health-checker.interval-ms 正整數 磁碟檢查器執行的間隔(毫秒);預設值為 2 分鐘
yarn.nodemanager.disk-health-checker.min-healthy-disks 0-1 之間的浮點數 必須通過檢查的磁碟最小比例,才能讓 NodeManager 將節點標記為正常;預設值為 0.25
yarn.nodemanager.disk-health-checker.max-disk-utilization-per-disk-percentage 0-100 之間的浮點數 磁碟檢查器服務將磁碟標記為不正常之前,可以使用的磁碟空間最大百分比。此檢查會針對 NodeManager 使用的每個磁碟執行。預設值為 90,表示可以使用 90% 的磁碟空間。
yarn.nodemanager.disk-health-checker.min-free-space-per-disk-mb 整數 磁碟檢查器服務將磁碟標記為正常時,磁碟上必須具備的可用空間最小容量。此檢查會針對 NodeManager 使用的每個磁碟執行。預設值為 0,表示可以使用整個磁碟空間。

外部健康檢查指令碼

使用者可以指定自己的健康檢查器腳本,由健康檢查器服務呼叫。使用者可以指定逾時時間以及傳遞給腳本的選項。如果腳本逾時、導致例外狀況拋出或輸出以 ERROR 字串開頭的行,則節點會標示為不正常。請注意

  • 0 以外的結束代碼不會被視為失敗,因為這可能是由語法錯誤造成的。因此,節點不會被標示為不正常。

  • 如果無法執行腳本,可能是因為權限或路徑不正確等原因,則會視為失敗,且節點會報告為不正常。

  • 指定健康檢查器腳本並非強制性。如果未指定腳本,則只會使用磁碟檢查器狀態來判斷節點的正常性。

使用者可以指定最多 4 個腳本,使用 yarn.nodemanager.health-checker.scripts 組態個別執行。這些選項也可以針對所有腳本組態(全域組態)

設定名稱 允許值 說明
yarn.nodemanager.health-checker.script 字串 健康檢查器腳本的關鍵字,以逗號分隔。預設值為「script」。
yarn.nodemanager.health-checker.interval-ms 正整數 健康檢查器服務執行的間隔,以毫秒為單位;預設值為 10 分鐘。
yarn.nodemanager.health-checker.timeout-ms 正整數 執行的健康腳本的逾時時間;預設值為 20 分鐘。

可以為每個健康檢查器腳本設定下列選項。%s 符號會代換為 yarn.nodemanager.health-checker.script 中提供的每個關鍵字。

設定名稱 允許值 說明
yarn.nodemanager.health-checker.%s.path 字串 要執行的健康檢查器腳本的絕對路徑。每個腳本的強制性引數。
yarn.nodemanager.health-checker.%s.opts 字串 執行腳本時要傳遞給腳本的引數。每個腳本的強制性引數。
yarn.nodemanager.health-checker.%s.interval-ms 正整數 健康檢查器服務執行的間隔,以毫秒為單位。
yarn.nodemanager.health-checker.%s.timeout-ms 正整數 執行的健康腳本的逾時時間。

間隔和逾時選項不需要指定。在這種情況下,將使用全域組態。

NodeManager 重新啟動

簡介

本文件概述 NodeManager (NM) 重新啟動,此功能讓 NodeManager 可以重新啟動,而不會遺失節點上執行的主動式容器。在高階層級,NM 會在處理容器管理要求時將任何必要的狀態儲存到本機狀態儲存。當 NM 重新啟動時,它會先載入各種子系統的狀態,然後讓這些子系統使用載入的狀態執行復原,以進行復原。

啟用 NM 重新啟動

步驟 1. 若要啟用 NM 重新啟動功能,請將 conf/yarn-site.xml 中下列屬性設定為 true

屬性
yarn.nodemanager.recovery.enabled true,(預設值設定為 false)

步驟 2. 設定 NodeManager 可用來儲存執行狀態的本機檔案系統目錄路徑。

屬性 說明
yarn.nodemanager.recovery.dir 啟用復原時,節點管理員將儲存狀態的本機檔案系統目錄。預設值設定為 $hadoop.tmp.dir/yarn-nm-recovery

步驟 3:在復原時啟用 NM 監督,以防止 NM 退出時執行中的容器遭清除。

屬性 說明
yarn.nodemanager.recovery.supervised 如果啟用,執行中的節點管理員不會嘗試在退出時清除容器,因為假設它將立即重新啟動並復原容器。預設值設定為「false」。

步驟 4. 設定 NodeManager 的有效 RPC 位址。

屬性 說明
yarn.nodemanager.address 無法將臨時埠(埠 0,為預設值)用於透過 yarn.nodemanager.address 指定的 NodeManager 的 RPC 伺服器,因為這會讓 NM 在重新啟動前後使用不同的埠。這將中斷在重新啟動前與 NM 通訊的所有先前執行中的用戶端。將 yarn.nodemanager.address 明確設定為具有特定埠號的位址(例如 0.0.0.0:45454)是啟用 NM 重新啟動的先決條件。

步驟 5. 輔助服務。

  • YARN 集群中的節點管理員可設定為執行輔助服務。對於完全運作的 NM 重新啟動,YARN 依賴任何設定為也支援復原的輔助服務。這通常包括 (1) 避免使用臨時埠,以便在重新啟動後不會中斷先前執行的用戶端(此情況通常為容器),以及 (2) 讓輔助服務本身支援復原能力,方法是在 NodeManager 重新啟動並重新初始化輔助服務時重新載入任何先前的狀態。

  • 上述內容的一個簡單範例是 MapReduce (MR) 的輔助服務「ShuffleHandler」。ShuffleHandler 已符合上述兩個需求,因此使用者/管理員不必為它執行任何操作以支援 NM 重新啟動:(1) 設定屬性 mapreduce.shuffle.port 控制 NodeManager 主機上的 ShuffleHandler 繫結的埠,而且預設為非臨時埠。(2) ShuffleHandler 服務也已支援在 NM 重新啟動後復原先前的狀態。

  • 有兩種方式可設定輔助服務,透過明細或透過設定檔。僅在未啟用輔助服務明細時,輔助服務才會透過使用設定檔屬性的先前方法載入。使用明細的一個優點是,NM 可以根據明細的變更動態重新載入輔助服務。為了支援重新載入,AuxiliaryService 實作必須在服務停止階段執行 NM 能夠建立輔助服務的新執行個體所需的任何清除作業。

輔助服務 Classpath 隔離

簡介

要在 NodeManager 上啟動輔助服務,使用者必須將其 jar 直接新增到 NodeManager 的 Classpath,進而將它們放在系統 Classloader 上。但是,如果 Classpath 上存在多個版本的外掛程式,則無法控制實際載入哪個版本。或者,如果輔助服務引入的相依性與 NodeManager 本身之間有任何衝突,它們可能會損毀 NodeManager、輔助服務或兩者。為了解決這個問題,我們可以使用與系統 Classloader 不同的 Classloader 來實例化輔助服務。

Manifest

本節說明 aux 服務 Classpath 隔離的輔助服務 Manifest。若要使用 Manifest,必須在 yarn-site.xml 中將屬性 yarn.nodemanager.aux-services.manifest.enabled 設為 true。

若要從檔案系統載入 Manifest 檔案,請在 yarn-site.xml 中的屬性 yarn.nodemanager.aux-services.manifest 下設定檔案路徑。NM 會以 yarn.nodemanager.aux-services.manifest.reload-ms 指定的間隔檢查此檔案是否有新的修改(預設為 0;設定間隔 <= 0 表示它不會自動重新載入)。或者,可以透過對端點 http://nm-http-address:port/ws/v1/node/auxiliaryservices 進行 PUT 呼叫,將 Manifest 檔案透過 REST API 傳送給 NM。請注意,這只會更新一個 NM 上的 Manifest。當 NM 讀取新的 Manifest 時,它會根據 Manifest 中找到的服務名稱和版本,視需要新增、移除或重新載入輔助服務。

以下是為 CustomAuxService 設定 Classpath 隔離的範例 Manifest。可以指定一個或多個檔案來組成服務的 Classpath,支援 jar 或檔案格式。

{
  "services": [
    {
      "name": "mapreduce_shuffle",
      "version": "2",
      "configuration": {
        "properties": {
          "class.name": "org.apache.hadoop.mapred.ShuffleHandler",
          "mapreduce.shuffle.transfer.buffer.size": "102400",
          "mapreduce.shuffle.port": "13562"
        }
      }
    },
    {
      "name": "CustomAuxService",
      "version": "1",
      "configuration": {
        "properties": {
          "class.name": "org.aux.CustomAuxService"
        },
        "files": [
          {
            "src_file": "${remote-dir}/CustomAuxService.jar",
            "type": "STATIC"
          },
          {
            "src_file": "${remote-dir}/CustomAuxService.tgz",
            "type": "ARCHIVE"
          }
        ]
      }
    }
  ]
}

設定

本節說明 aux 服務 Classpath 隔離的設定變數。如果未指定 Manifest 檔案,則只會從設定載入 aux 服務。

必須在 yarn-site.xml 中設定下列設定。

設定名稱 說明
yarn.nodemanager.aux-services.%s.classpath 提供包含相關 jar 檔案以及所有相依性 jar 檔案的本機目錄。我們可以指定單一 jar 檔案或使用 ${local_dir_to_jar}/* 來載入 dep 目錄下的所有 jar。
yarn.nodemanager.aux-services.%s.remote-classpath 提供 jar 檔案的遠端絕對或相對路徑(我們也支援 zip、tar.gz、tgz、tar 和 gz 檔案)。對於相同的 aux 服務類別,我們只能指定下列設定之一:yarn.nodemanager.aux-services.%s.classpath 或 yarn.nodemanager.aux-services.%s.remote-classpath。將擲回 YarnRuntimeException。請也確定 jar 檔案的所有者必須與 NodeManager 使用者相同,且 permbits 必須符合 (permbits & 0022)==0(例如 600,群組或其他使用者無法寫入)。
yarn.nodemanager.aux-services.%s.system-classes 一般來說,我們不需要設定此組態。如果類別不屬於 system-classes,它會從自訂類別路徑載入。例如,預設情況下,org.apache.hadoop 套件在 system-classes 中,如果您的類別 CustomAuxService 在 org.apache.hadoop 套件中,它不會從自訂類別路徑載入。要解決此問題,我們可以變更 CustomAuxService 的套件,或組態我們自己的 system-classes,排除 org.apache.hadoop。

組態範例

<property>
	<name>yarn.nodemanager.aux-services</name>
	<value>mapreduce_shuffle,CustomAuxService</value>
</property>

<property>
	<name>yarn.nodemanager.aux-services.CustomAuxService.classpath</name>
	<value>${local_dir_to_jar}/CustomAuxService.jar</value>
</property>

<!--
<property>
	<name>yarn.nodemanager.aux-services.CustomAuxService.remote-classpath</name>
	<value>${remote-dir_to_jar}/CustomAuxService.jar</value>
</property>
-->

<property>
	<name>yarn.nodemanager.aux-services.CustomAuxService.class</name>
	<value>org.aux.CustomAuxService</value>
</property>

<property>
	<name>yarn.nodemanager.aux-services.mapreduce_shuffle.class</name>
	<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>

避免容器記錄過大

叢集管理員可以使用此功能組態叢集,如果任何容器記錄超過組態大小,就會終止任務嘗試。這有助於避免記錄填滿磁碟,並避免需要彙總龐大的記錄。

設定

下列參數可用於組態容器記錄目錄大小。

設定名稱 允許值 說明
yarn.nodemanager.container-log-monitor.enable true、false 旗標,用於啟用容器記錄監視器,強制執行容器記錄目錄大小限制。預設為 false。
yarn.nodemanager.container-log-monitor.interval-ms 正整數 以毫秒為單位,檢查容器記錄目錄使用率的頻率。預設為 60000 毫秒。
yarn.nodemanager.container-log-monitor.dir-size-limit-bytes 長整數 單一容器記錄目錄的磁碟空間限制(以位元組為單位)。預設為 1000000000。
yarn.nodemanager.container-log-monitor.total-size-limit-bytes 長整數 所有容器記錄的磁碟空間限制(以位元組為單位)。預設為 10000000000。

根據 CPU 使用率調整心跳間隔

叢集管理員可以使用此功能組態叢集,允許根據節點的 CPU 使用率與叢集整體 CPU 使用率的比較,調整資源管理員與各個節點管理員之間的心跳。

設定

下列參數可用於組態心跳間隔,以及是否調整以及如何調整。

設定名稱 允許值 說明
yarn.resourcemanager.nodemanagers.heartbeat-interval-ms 長整數 指定叢集中每個節點管理員的預設心跳間隔(以毫秒為單位)。預設為 1000 毫秒。
yarn.resourcemanager.nodemanagers.heartbeat-interval-scaling-enable true、false 啟用心跳間隔調整。如果為 true,節點管理員心跳間隔會根據節點上的 CPU 使用率與叢集範圍平均 CPU 使用率的差異進行調整。預設為 false。
yarn.resourcemanager.nodemanagers.heartbeat-interval-min-ms 正長整數 如果啟用心跳間隔調整,這是以毫秒為單位的最小心跳間隔。預設為 1000 毫秒。
yarn.resourcemanager.nodemanagers.heartbeat-interval-max-ms 正長整數 如果啟用心跳間隔調整,這是以毫秒為單位的最大心跳間隔。預設為 1000 毫秒。
yarn.resourcemanager.nodemanagers.heartbeat-interval-speedup-factor 正浮點數 如果啟用心跳間隔調整,這會控制在加速心跳間隔時的調整程度。在 1.0 時,低於平均叢集廣域 CPU 使用率 20% 將導致心跳間隔減少 20%。預設為 1.0。
yarn.resourcemanager.nodemanagers.heartbeat-interval-slowdown-factor 正浮點數 如果啟用心跳間隔調整,這會控制在減慢心跳間隔時的調整程度。在 1.0 時,高於平均叢集廣域 CPU 使用率 20% 將導致心跳間隔增加 20%。預設為 1.0。