ResourceManager 高可用性

簡介

本指南概述 YARN 的 ResourceManager 高可用性,並詳細說明如何組態和使用此功能。ResourceManager (RM) 負責追蹤叢集中的資源,並排程應用程式(例如 MapReduce 作業)。在 Hadoop 2.4 之前,ResourceManager 是 YARN 叢集中單點故障。高可用性功能新增了 Active/Standby ResourceManager 配對的備援,以移除此單點故障。

架構

Overview of ResourceManager High Availability

RM 故障轉移

ResourceManager HA 是透過 Active/Standby 架構實現的 - 在任何時間點,其中一個 RM 是 Active,而一個或多個 RM 處於 Standby 模式,等待在 Active 發生任何狀況時接手。轉換為 active 的觸發來自管理員(透過 CLI)或在啟用自動故障轉移時透過整合的故障轉移控制器。

手動轉換和故障轉移

在未啟用自動故障轉移時,管理員必須手動將其中一個 RM 轉換為 Active。若要從一個 RM 故障轉移到另一個 RM,他們預計會先將 Active-RM 轉換為 Standby,再將 Standby-RM 轉換為 Active。所有這些都可以使用「yarn rmadmin」CLI 來完成。

自動故障轉移

RM 有個選項可以內嵌基於 Zookeeper 的 ActiveStandbyElector,以決定哪個 RM 應該為 Active。當 Active 停機或變成沒有回應時,會自動選出另一個 RM 為 Active,然後接手。請注意,不需要執行一個獨立的 ZKFC 程式,就像 HDFS 的情況一樣,因為內嵌在 RM 中的 ActiveStandbyElector 會充當故障偵測器和領導選取器,而不是一個獨立的 ZKFC 程式。

RM 故障轉移上的 Client、ApplicationMaster 和 NodeManager

當有多個 RM 時,client 和節點使用的設定檔 (yarn-site.xml) 預期會列出所有 RM。Client、ApplicationMaster (AM) 和 NodeManager (NM) 會嘗試以循環的方式連線到 RM,直到連線到 Active RM。如果 Active 停機,它們會繼續循環輪詢,直到連線到「新的」Active。這個預設的重試邏輯實作為 org.apache.hadoop.yarn.client.ConfiguredRMFailoverProxyProvider。您可以透過實作 org.apache.hadoop.yarn.client.RMFailoverProxyProvider 並將 yarn.client.failover-proxy-provider 的值設定為類別名稱來覆寫邏輯。在非 HA 模式下執行時,請改為設定 yarn.client.failover-no-ha-proxy-provider 的值

復原先前的 active-RM 狀態

在啟用 ResourceManager 重新啟動 的情況下,提升為 active 狀態的 RM 會載入 RM 內部狀態,並盡可能從先前 active 離開的地方繼續執行,具體取決於 RM 重新啟動功能。會為先前提交給 RM 的每個受管理應用程式產生一個新的嘗試。應用程式可以定期檢查點,以避免遺失任何工作。狀態儲存必須對 Active/Standby RM 可見。目前,有兩個 RMStateStore 實作可供持久性使用 - FileSystemRMStateStore 和 ZKRMStateStore。ZKRMStateStore 隱含允許在任何時間點對單一 RM 進行寫入存取,因此建議在 HA 群集中使用這個儲存。在使用 ZKRMStateStore 時,不需要一個獨立的圍欄機制來處理多個 RM 可能假設 Active 角色的潛在腦裂情況。在使用 ZKRMStateStore 時,建議不要在 Zookeeper 群集上設定「zookeeper.DigestAuthenticationProvider.superDigest」屬性,以確保 zookeeper 管理員無法存取 YARN 應用程式/使用者憑證資訊。

部署

設定

大部分的故障轉移功能都可以使用各種設定屬性進行調整。以下是所需/重要的屬性清單。yarn-default.xml 載有完整參數清單。請參閱 yarn-default.xml 以取得更多資訊,包括預設值。請參閱 ResourceManager 重新啟動 文件,以取得設定狀態儲存的說明。

設定屬性 說明
hadoop.zk.address ZK-quorum 的位址。用於狀態儲存和內嵌領導者選舉。
yarn.resourcemanager.ha.enabled 啟用 RM HA。
yarn.resourcemanager.ha.rm-ids RM 的邏輯 ID 清單。例如,「rm1、rm2」。
yarn.resourcemanager.hostname.rm-id 針對每個 rm-id,指定 RM 對應的主機名稱。或者,可以設定每個 RM 的服務位址。
yarn.resourcemanager.address.rm-id 針對每個 rm-id,指定主機:埠供客戶端提交工作。如果設定,會覆寫 yarn.resourcemanager.hostname.rm-id 中設定的主機名稱。
yarn.resourcemanager.scheduler.address.rm-id 針對每個 rm-id,指定排程器主機:埠供 ApplicationMasters 取得資源。如果設定,會覆寫 yarn.resourcemanager.hostname.rm-id 中設定的主機名稱。
yarn.resourcemanager.resource-tracker.address.rm-id 針對每個 rm-id,指定主機:埠供 NodeManagers 連線。如果設定,會覆寫 yarn.resourcemanager.hostname.rm-id 中設定的主機名稱。
yarn.resourcemanager.admin.address.rm-id 針對每個 rm-id,指定主機:埠供管理指令使用。如果設定,會覆寫 yarn.resourcemanager.hostname.rm-id 中設定的主機名稱。
yarn.resourcemanager.webapp.address.rm-id 針對每個 rm-id,指定對應的 RM 網路應用程式的主機:埠。如果將 yarn.http.policy 設定為 HTTPS_ONLY,則不需要這個設定。如果設定,會覆寫 yarn.resourcemanager.hostname.rm-id 中設定的主機名稱。
yarn.resourcemanager.webapp.https.address.rm-id 針對每個 rm-id,指定對應的 RM https 網路應用程式的主機:埠。如果將 yarn.http.policy 設定為 HTTP_ONLY,則不需要這個設定。如果設定,會覆寫 yarn.resourcemanager.hostname.rm-id 中設定的主機名稱。
yarn.resourcemanager.ha.id 識別組群中的 RM。這個設定是選用的;但是,如果設定,管理員必須確保所有 RM 在設定中都有自己的 ID。
yarn.resourcemanager.ha.automatic-failover.enabled 啟用自動故障轉移;預設情況下,只有在啟用 HA 時才會啟用。
yarn.resourcemanager.ha.automatic-failover.embedded 在啟用自動故障轉移時,使用內嵌領導者選擇器選取 Active RM。預設情況下,只有在啟用 HA 時才會啟用。
yarn.resourcemanager.cluster-id 識別群集。選舉器使用這個設定來確保 RM 不會接管另一個群集的 Active。
yarn.client.failover-proxy-provider 客戶端、AM 和 NM 用於故障轉移到 Active RM 的類別。
yarn.client.failover-no-ha-proxy-provider 客戶端、AM 和 NM 用於故障轉移到 Active RM 的類別,在非 HA 模式下執行時
yarn.client.failover-max-attempts FailoverProxyProvider 應嘗試故障轉移的最大次數。
yarn.client.failover-sleep-base-ms 用於計算故障轉移之間指數延遲的睡眠基準(以毫秒為單位)。
yarn.client.failover-sleep-max-ms 故障轉移之間的最大睡眠時間(以毫秒為單位)。
yarn.client.failover-retries 每次嘗試連線到 ResourceManager 的重試次數。
yarn.client.failover-retries-on-socket-timeouts 在 socket 超時時,每次嘗試連線到 ResourceManager 的重試次數。

範例組態

以下是 RM 故障轉移的最小設定範例。

<property>
  <name>yarn.resourcemanager.ha.enabled</name>
  <value>true</value>
</property>
<property>
  <name>yarn.resourcemanager.cluster-id</name>
  <value>cluster1</value>
</property>
<property>
  <name>yarn.resourcemanager.ha.rm-ids</name>
  <value>rm1,rm2</value>
</property>
<property>
  <name>yarn.resourcemanager.hostname.rm1</name>
  <value>master1</value>
</property>
<property>
  <name>yarn.resourcemanager.hostname.rm2</name>
  <value>master2</value>
</property>
<property>
  <name>yarn.resourcemanager.webapp.address.rm1</name>
  <value>master1:8088</value>
</property>
<property>
  <name>yarn.resourcemanager.webapp.address.rm2</name>
  <value>master2:8088</value>
</property>
<property>
  <name>hadoop.zk.address</name>
  <value>zk1:2181,zk2:2181,zk3:2181</value>
</property>

管理命令

yarn rmadmin 有幾個 HA 特定命令選項,用於檢查 RM 的健康狀況/狀態,並轉換為 Active/Standby。HA 命令採用 yarn.resourcemanager.ha.rm-ids 設定的 RM 服務 ID 作為引數。

 $ yarn rmadmin -getServiceState rm1
 active
 
 $ yarn rmadmin -getServiceState rm2
 standby

如果啟用自動故障轉移,您無法使用手動轉換命令。儘管您可以透過 –forcemanual 旗標覆寫此設定,但您需要小心。

 $ yarn rmadmin -transitionToStandby rm1
 Automatic failover is enabled for org.apache.hadoop.yarn.client.RMHAServiceTarget@1d8299fd
 Refusing to manually manage HA state, since it may cause
 a split-brain scenario or other incorrect state.
 If you are very sure you know what you are doing, please
 specify the forcemanual flag.

請參閱 YarnCommands 以取得更多詳細資訊。

ResourceManager 網頁 UI 服務

假設備用 RM 已啟動並執行,備用 RM 會自動將所有網頁要求重新導向到 Active,但「關於」頁面除外。

網路服務

假設備用 RM 已啟動並執行,在備用 RM 上呼叫 ResourceManager REST API 中描述的 RM 網路服務時,會自動重新導向到 Active RM。

負載平衡器設定

如果您在負載平衡器(例如 AzureAWS )之後執行一組 ResourceManager,並希望負載平衡器指向 active RM,您可以使用 /isActive HTTP 端點作為健康檢查。如果 RM 處於 Active HA 狀態,http://RM_HOSTNAME/isActive 將傳回 200 狀態碼回應,否則傳回 405。