天天看點

ResourceManager HA 配置

陸續的把Hadoop叢集部署、HDFS的HA配置完成,把ResourceManager的HA配置好之後,Hadoop叢集配置也算是完整了,可以滿足小型中型生産環境Hadoop叢集搭建的需要。如果真要搭建超大型的Hadoop叢集,這些隻能算是參考,還需要修改很多其他參數,使性能更好一些。

ResourceManager(RM)負責跟蹤叢集中資源使用情況,排程應用程式(比如MapReduce作業)。在Hadoop 2.4之前,ResourceManager存在單點故障,需要通過其他方式實作HA。官方給出的HA方案是Active/Standby兩種狀态ResourceManager的備援方式,類似于HDFS的HA方案,也就是通過備援消除單點故障。

HA架構

下圖是ResourceManager HA方案架構圖:

ResourceManager HA 配置

RM故障轉移

ResourceManager HA是通過Active/Standby備援架構實作的,在任何時間點,其中一個RM處于Active狀态,其他RM處于Standby狀态,Standby狀态的RM就等着Active撲街或被撤。通過管理者指令或自動故障轉移(需要開啟自動故障轉移配置),Standby就會轉為Active狀态,對外提供服務。

手動轉換和故障轉移:當未啟用自動故障轉移時,就需要管理者手動轉換。首先将Active狀态的RM轉為Standby狀态,然後将一個Standby狀态的轉為Active狀态。這些操作都需要通過yarn rmadmin指令來操作。

自動故障轉移:RM可以通過内嵌的基于Zookeeper的Active/Standby選擇器決定哪個RM應該是Active狀态的。當Active性能下降或無響應時,一個Standby狀态的RM就被推舉出來,轉為Active狀态接管。這裡不需要像HDFS的HA配置需要一個單獨的ZKFS守護程序輔助完成切換,因為這個功能已經内嵌在RM中。

用戶端、ApplicationMaster和NodeManager在故障轉移時,會輪訓這些RM節點,知道找到Active狀态的RM。如果Active節點性能下降,他們會重新輪訓查找新的Active狀态的RM。預設的輪訓擴充是org.apache.hadoop.yarn.client.ConfiguredRMFailoverProxyProvider。可以通過實作org.apache.hadoop.yarn.client.RMFailoverProxyProvider,并配置yarn.client.failover-proxy-provider來實作自己的邏輯。

恢複RM狀态

當啟用ResourceManger重新開機狀态恢複之後,新的Active狀态的RM會加載上一個RM狀态,并根據狀态盡可能的恢複之前的操作。應用程式會定期檢查,以避免丢失資料。狀态存儲需要對Active狀态和Standby狀态的RM都可見。目前,RMStateStore有兩個持久化實作,FileSystemRMStateStore和ZKRMStateStore。ZKRMStateStore隐式的隻允許一個RM寫入操作,可以沒有單獨的防護機制就能夠避免鬧裂問題,是以是HA叢集推薦的狀态存儲方式。使用ZKRMStateStore時,建議不要在zookeeper叢集上設定zookeeper.DigestAuthenticationProvider.superDigest配置,以確定zk管理者無法通路YARN的資訊。

部署

配置

大多數的故障轉移功能可以使用各種配置進行調整,下表是必須的和重要的參數項。完整的配置和預設值參見yarn-default.xml。關于狀态存儲參見ResourceManger狀态存儲。

配置項 描述

yarn.resourcemanager.zk-address zookeeper叢集位址,用于狀态存儲和内部的leader選舉

yarn.resourcemanager.ha.enabled 開啟RM的HA

yarn.resourcemanager.ha.rm-ids RM邏輯id清單,以逗号分割,比如:rm1,rm2。

yarn.resourcemanager.hostname.[rm-id] 對于每個rm-id,需要給出hostname或ip位址。

yarn.resourcemanager.address.[rm-id] 對于每個rm-id,指定host:port位址,該配置會覆寫yarn.resourcemanager.hostname.rm-id。

yarn.resourcemanager.scheduler.address.[rm-id] 對于每個rm-id,指定ApplicationMasters申請資源的Scheduler的host:port位址,該配置會覆寫yarn.resourcemanager.hostname.rm-id。

yarn.resourcemanager.resource-tracker.address.[rm-id] 對于每個rm-id,指定NodeManager連接配接的host:port位址,該配置會覆寫yarn.resourcemanager.hostname.rm-id。

yarn.resourcemanager.admin.address.[rm-id] 對于每個rm-id,指定管理指令操作的host:port位址,該配置會覆寫yarn.resourcemanager.hostname.rm-id。

yarn.resourcemanager.webapp.address.[rm-id] 對于每個rm-id,指定RM的web應用host:port位址,如果設定yarn.http.policy是HTTPS_ONLY,就沒必要設定該參數。該參數會覆寫yarn.resourcemanager.hostname.rm-id。

yarn.resourcemanager.webapp.https.address.[rm-id] 對于每個rm-id,指定RM的web應用host:port位址,如果設定yarn.http.policy是HTTP_ONLY,就沒必要設定該參數。該參數會覆寫yarn.resourcemanager.hostname.rm-id。

yarn.resourcemanager.ha.id 用于識别HA的RM,可選配置。如果設定,需要确定所有的RM都有自己的ID。

yarn.resourcemanager.ha.automatic-failover.enabled 啟用自動故障轉移; 預設情況下,僅當HA被啟用時才啟用。

yarn.resourcemanager.ha.automatic-failover.embedded 啟用自動故障轉移時,使用嵌入式leader選舉選擇Active RM。 預設情況下,僅當HA被啟用時才啟用。

yarn.resourcemanager.cluster-id 叢集标志,用于保證RM不會成為另一個叢集的Active節點。

yarn.client.failover-proxy-provider 用戶端使用,用于用戶端、ApplicationMaster、NodeManager連接配接到新的Active的RM。

yarn.client.failover-max-attempts FailoverProxyProvider應該嘗試的最大次數。

yarn.client.failover-sleep-base-ms 用于計算故障轉移的休眠基準(機關是毫秒)。

yarn.client.failover-sleep-max-ms 故障轉移休眠最長時間(機關是毫秒)。

yarn.client.failover-retries 嘗試連接配接到RM的重試次數。

yarn.client.failover-retries-on-socket-timeouts 嘗試連接配接到RM中可允許逾時連接配接的次數。

配置示例(配置承接hadoop叢集部署(yarn)中的,使用s107和s108作為RM雙節點):

<!--Configurations for the state-store of ResourceManager-->
<property>
  <name>yarn.resourcemanager.recovery.enabled</name>
  <value>true</value>
</property>
<property>
  <name>yarn.resourcemanager.store.class</name>
  <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>
<property>
  <name>yarn.resourcemanager.zk-address</name>
  <value>10.6.3.109:2181,10.6.3.110:2181,10.6.3.111:2181</value>
  <description>ZooKeeper服務的位址,多個位址使用逗号隔開</description>
</property>
<!--Configurations for HA of ResourceManager-->
<property>
  <name>yarn.resourcemanager.ha.enabled</name>
  <value>true</value>
  <description>是否啟用HA,預設false</description>
</property>
<property>
  <name>yarn.resourcemanager.ha.rm-ids</name>
  <value>rm1,rm2</value>
  <description>最少2個</description>
</property>
<property>
  <name>yarn.resourcemanager.hostname.rm1</name>
  <value>s107</value>
</property>
<property>
  <name>yarn.resourcemanager.hostname.rm2</name>
  <value>s108</value>
</property>
<property>
  <name>yarn.resourcemanager.cluster-id</name>
  <value>yarn-ha</value>
  <description>叢集HA的id,用于在ZooKeeper上建立節點,區分使用同一個ZooKeeper叢集的不同Hadoop叢集</description>
</property>
<property>
    <name>yarn.resourcemanager.webapp.address.rm1</name>
    <value>s107:8088</value>
</property>
<property>
    <name>yarn.resourcemanager.webapp.address.rm2</name>
    <value>s108:8088</value>
</property>      

啟動

可以在s107上直接通過start-yarn.sh啟動YARN,這樣在s107上會啟動ResourceManager,在其他節點上會啟動NodeManager。

需要注意的是s108上不會自己啟動ResourceManager,需要手動啟動。通過指令yarn-daemon.sh start resourcemanager手動啟動。

管理指令

對于YARN的管理前面又說到,用的指令是yarn rmadmin,可以檢查RM的健康狀态、轉換Active/Standby狀态等,需要使用yarn.resourcemanager.ha.rm-ids參數配置的RM的id作為參數。比如,檢視RM狀态:

$ yarn rmadmin -getServiceState rm1
active

$ yarn rmadmin -getServiceState rm2
standby      

其他的指令可以通過yarn rmadmin -help擷取。

Web管理頁面

管理界面就是yarn.resourcemanager.webapp.address.[rm-id]配置的位址,如果通路的是Standby的RM位址,會自動重定向到Active狀态的RM位址。About頁面除外,可以通路About頁面檢視目前哪個節點是Active狀态,哪個是Standby狀态的。

參考文章

1. ResourceManager High Availability

繼續閱讀