1. RM Failover
ResourceManager HA 由一个Active/Standby 架构实现:在任何时间点,仅有一个RM是Active,其他一个(或多个)RM节点处于Standby 模式,在Active RM发生故障后,Standby RM 取代它并接管Active的工作。触发转换成active的操作可以由管理命令完成,或是自动由内置的failover-controller完成(需要开启automatic-failover的功能)。
2. 手动转换与failover
当自动failover没有开启时,管理员需要手动将RM的状态转为Active。为了完成failover,首先需要将Active-RM 转换为Standby,然后将Standby-RM 转换为Active。这些均可以通过 yarn rmadmin 命令完成。
3. 自动failover
RMs可以配置一个内置的,基于 Zookeeper 的ActiveStandbyElector,用于决定哪个RM应该是Active的。当Active RM 出现故障下线,或者无法响应了,另一个RM会被自动推选为Active,并接管之后的工作。需要注意的是,这里没有必要像 HDFS HA 那样运行一个额外的ZKFC守护进程,因为ActiveStandbyElector 内置于RM,担任failure detector以及leader elector的角色,可以替代ZKFC守护进程
4. 客户端,ApplicationMaster 以及 NodeManager 与RM failover
当集群中有多个RM时,客户端以及节点所使用的 yarn-site.xml配置文件中,需要列出所有的RMs。客户端,AM以及NM会尝试以轮询的方式去连接RMs,直到命中Active RM。如果Active RM 下线了,则它们会重新尝试轮询,直到命中新的Active RM。默认的重试逻辑由org.apache.hadoop.yarn.client.ConfiguredRMFailoverProxyProvider.可以通过实现org.apache.hadoop.yarn.client.RMFailoverProxyProvider类并设置参数 yarn.client.failover-proxy-provider 为实现的类名,以覆盖默认的实现。
5. 恢复前一个active-RM 的状态
在ResourceManager Restart的功能开启后,RM可以被提升为active 状态。加载RM的内部状态数据,并尽可能地从前一个active RM 终止的点继续工作(依赖于RM restart的功能)。对于前Active RM 管理的每个提交的application,均会发起一个新的attempt。Applications可以定期做checkpoint,以防止丢失任何工作。存储的RM 应用状态的 state-store 必须均可被Active/Standby RM 访问。对于状态数据持久化,当前有两种实现RMStateStore 的方式:FileSystemRMStateStore 和 ZKRMStateStore。ZKRMStateStore 在任何时刻仅允许一个RM 拥有写权限,所以它时在HA集群中被推荐使用的方式。在使用ZKRMStateStore时,没有必要再单独增加一个fencing机制(此机制防止可能的脑裂状态),因为多个RM可以自行assume the Active role。
在使用ZKRMStateStore时,建议不要在Zookeeper中设置zookeeper.DigestAuthenticationProvider.superDigest 属性,以确保zookeeper admin 没有访问 yarn application/user credential 信息的权限。
6. 部署
下面是YARN HA 有关配置项:
1. yarn.resourcemanager.zk-address
ZK-quorum的地址,用于state-store以及embedded leader-election
2. yarn.resourcemanager.ha.enabled
Enable HA
3. yarn.resourcemanager.rm-ids
列出RMs的逻辑 id,如:
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2,rm3</value>
</property>
4. yarn.resourcemanager.hostname.rm-id
对每个 rm-id,设置它对应的RM hostname,如:
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>xx.xx.xx.xx</value>
</property>
5. yarn.resourcemanager.address.rm-id
对每个rm-id,指定host:port地址,用于客户端提交job。在指定后,会覆盖 yarn.resourcemanager.hostname.rm-id 里的内容,例如:
<property>
<name>yarn.resourcemanager.address.rm1</name>
<value>ip-xx.xx.xx.xx:8032</value>
</property>
6. yarn.resourcemanager.ha.automatic-failover.enabled
开启自动failover功能,仅当HA功能开启后才开启此功能
7. yarn.resourcemanager.ha.automatic-failover.embedded
使用内置的 leader-elector 选择Active RM,仅当 HA 功能开启后才开启此功能
8. yarn.resourcemanager.cluster-id
集群标识符,elector 使用此属性以确保某个RM不会接管另一集群的工作,例如:
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>ha-rm-uri</value>
</property>
7. 管理命令
yarn rmadmin 提供了部分 HA 相关的命令,用于检查RM 的健康状态,并转换某个RM的状态到Active/Standby。命令接受的 RM id为配置文件中 yarn.resourcemanager.ha.rm-ids 中指定的id。
常规命令如:
> yarn rmadmin -getServiceState rm1
standby
> yarn rmadmin -getServiceState rm3
active
> yarn rmadmin -getAllServiceState
ip-x.x.x.x:8033 standby
ip-y.y.y.y:8033 standby
ip-z.z.z.z:8033 active
如果开启了自动failover的功能,则无法手动做transition。不过仍可以通过加上 -forcemanual 的标识进行强制手动failover(不建议):
> yarn rmadmin -transitionToActive rm1
Automatic failover is enabled for org.apache.hadoop.yarn.client.RMHAServiceTarget@1ea9f6af
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.
也可以在zookeeper 里查看对应 active 的 RM
> get /yarn-leader-election/ha-rm-uri/ActiveBreadCrumb
ha-rm-uri
rm1
> get /yarn-leader-election/ha-rm-uri/ActiveStandbyElectorLock
ha-rm-uri
rm1
8. Web Service and UI
在 standby RM 也是正常运行的情况下,在访问standby RM 的 web UI 地址时,会自动转发请求到Active 的 RM,除了“About”页面
对于发往standby RM 的 Yarn Web Service (如 yarn REST APIs)的请求,standby RM 也会自动重定向到Active 的 RM
References:
https://hadoop.apache.org/docs/current/hadoop-yarn/hadoop-yarn-site/ResourceManagerHA.html