本指南概述 YARN 的 ResourceManager 高可用性,並詳細說明如何組態和使用此功能。ResourceManager (RM) 負責追蹤叢集中的資源,並排程應用程式(例如 MapReduce 作業)。在 Hadoop 2.4 之前,ResourceManager 是 YARN 叢集中單點故障。高可用性功能新增了 Active/Standby ResourceManager 配對的備援,以移除此單點故障。
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 和節點使用的設定檔 (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
的值
在啟用 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 以取得更多詳細資訊。
假設備用 RM 已啟動並執行,備用 RM 會自動將所有網頁要求重新導向到 Active,但「關於」頁面除外。
假設備用 RM 已啟動並執行,在備用 RM 上呼叫 ResourceManager REST API 中描述的 RM 網路服務時,會自動重新導向到 Active RM。
如果您在負載平衡器(例如 Azure 或 AWS )之後執行一組 ResourceManager,並希望負載平衡器指向 active RM,您可以使用 /isActive HTTP 端點作為健康檢查。如果 RM 處於 Active HA 狀態,http://RM_HOSTNAME/isActive 將傳回 200 狀態碼回應,否則傳回 405。