陸續的把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方案架構圖:
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
個人主頁: http://www.howardliu.cn
個人博文: ResourceManager HA 配置
CSDN主頁: http://blog.csdn.net/liuxinghao
CSDN博文: ResourceManager HA 配置