@changedi
2017-07-07T16:41:33.000000Z
字数 4035
阅读 16578
大数据
YARN
原文:http://hadoop.apache.org/docs/r2.6.4/hadoop-yarn/hadoop-yarn-site/ResourceManagerHA.html
本文档提供一个YARN的ResourceManager的High Availability的概述以及如何配置的细节。RM负责追踪集群的资源和调度应用作业(比如Mapreduce作业)。在Hadoop 2.4之前,ResourceManager是YARN集群的单点。高可用特性就是用来解决单点问题的,通过加入一个Active/Standby的ResourceManager对来解决。
ResourceManager HA通过一个主从架构实现——在任意时刻,总有一个RM是active的,而一个或更多的RM处于standby状态等待随时成为active。触发active的转换的条件是通过admin命令行或者在automatic-failover启用的情况下通过集成的failover-controller触发。
当自动failover没有启用时,管理员需要手动切换众多RM中的一个成为active。为了从一个RM到其他RM进行failover,做法通常是先将现在的Active的RM切为Standby,然后再选择一个Standby切为Active。所有这些都可以通过"yarn rmadmin"的命令行完成。
RM有一个选项可以嵌入使用Zookeeper的ActiveStandbyElector来决定哪个RM成为Active。当Active挂掉或者不响应时,另一个RM会自动被选举为Active然后接管集群。注意,并不需要像HDFS一样运行一个隔离的ZKFC守护进程,因为对于嵌入到RM中的ActiveStandbyElector表现出来就是在做failure检查和leader选举,不用单独的ZKFC。
当有多个RM时,被client和node使用的配置文件yarn-site.xml需要列出所有的RM。Clients, ApplicationMasters (AMs) 和 NodeManagers (NMs) 会以一种round-robin轮询的方式来不断尝试连接RM直到其命中一个active的RM。如果当前Active挂掉了,他们会恢复round-robin来继续寻找新的Active。默认的重试策略是 org.apache.hadoop.yarn.client.ConfiguredRMFailoverProxyProvider类来实现的。你可以通过继承实现org.apache.hadoop.yarn.client.RMFailoverProxyProvider来覆盖这个方法,并且设置对应的类名到这个属性yarn.client.failover-proxy-provider。
伴随ResourceManager的重启机制开启,升级为主的RM会加载RM内部状态并且恢复原来RM留下的状态,而这依赖于RM的重启特性。而之前提交到RM的作业会发起一个新的尝试请求。应用作业会周期性的checkpoint来避免任务丢失。状态存储对于所有的RM都必须可见。当前,有两种RMStateStore实现来支持持久化—— FileSystemRMStateStore 和 ZKRMStateStore。其中 ZKRMStateStore隐式的允许在任意时刻写到一个单一的RM,因此是HA集群的推荐存储。当使用ZKRMStateStore时,不需要单独的隔离机制来解决分布式的脑裂问题(多个RM都成为Active)。
大多数的failover机制是可以通过多个配置属性来调节的。以下是一些必须或者重要的属性。yarn-default.xml带有全部的属性节点。更多细节和默认值,参看yarn-default.xml。
Configuration Property | Description |
---|---|
yarn.resourcemanager.zk-address | zk-quorum的地址。同时用于状态存储和leader选举。 |
yarn.resourcemanager.ha.enabled | Enable RM HA |
yarn.resourcemanager.ha.rm-ids | RM的逻辑id,比如"rm1,rm2" |
yarn.resourcemanager.hostname.rm-id | 对于每个rm-id,声明一个对应的主机名,也可以声明rm的服务地址来替换。 |
yarn.resourcemanager.ha.id | 在全体中识别RM。可选参数;如果设置了,admin需要确保所有的RM都有属于自己的id。 |
yarn.resourcemanager.ha.automatic-failover.enabled | 启动自动failover;只有在HA启动的情况下默认启动。 |
yarn.resourcemanager.ha.automatic-failover.embedded | 当启用自动failover后,使用内置的leader选举来选主RM。只有当HA启用时默认是开启的。 |
yarn.resourcemanager.cluster-id | 标识集群。被elector用来确保RM不会接管另一个集群,即不会成为其他集群的主RM。 |
yarn.client.failover-proxy-provider | Clients, AMs NMs连接主RM,实现failover的类 |
yarn.client.failover-max-attempts | FailoverProxyProvider尝试failover的最大次数。 |
yarn.client.failover-sleep-base-ms | failover之间计算延迟的睡眠时间(单位是毫秒) |
yarn.client.failover-sleep-max-ms | failover之间的睡眠最大时间(单位毫秒) |
yarn.client.failover-retries | 每次连接RM的重试次数。 |
yarn.client.failover-retries-on-socket-timeouts | 每次连接RMsocket超时的重试次数。 |
这是一个RM failover配置的最小配置。
<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.zk-address</name>
<value>zk1:2181,zk2:2181,zk3:2181</value>
</property>
yarn rmadmin有一组HA相关的命令选项来检查RM的健康状态,以及切换主备。HA用来切换的RM的id由 yarn.resourcemanager.ha.rm-ids属性设置。
$ yarn rmadmin -getServiceState rm1
active
$ yarn rmadmin -getServiceState rm2
standby
如果自动failover开启,就不需要手动的切换命令了。
$ 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。
假设一个standby的RM启动并服务,Standby会自动重定向所有的web请求到Active,除了About页面。
假设一个standby的RM启动并服务,被一个standby RM调用的REST API相关的web服务会自动重定向到Active RM。