介绍
本指南提供YARN的ResourceManager 的HA概览,以及如何配置和使用这些特性。ResourceManager(RM)负责跟踪集群中的资源,调度application(如MapReduce job)。hadoop 2.4之前,ResourceManager在YARN集群中存在单点故障的隐患。HA特性通过主备ResourceManager的方案解决单点故障问题。
架构
RM灾备
ResourceManager HA通过主备架构实现——在任意时刻,一个RM处于Active模式,另外一个或者多个处于Standby模式,等待某种情况发生则转为Active模式。切换为Active的触发器要么来自管理员(通过CLI)或者是在automatic-failover启用的情况下通过集成的 failover-controller。
手动切换和灾备
在自动灾备没有启用时,管理员不得不手动切换其中一个RM到Active。要切换灾备的RM到另一个,需要首先切换Active-RM为Standby,然后切换一个Standby-RM到Active。所有这些都可以使用 “
yarn rmadmin
” 客户端命令完成.
自动灾备
RM有一个选项可以嵌入基于Zookeeper的主备选举来决定哪一个RM应该为Active。当Active宕机或者变成不可用,其他RM自动被选举为Active。请注意,没有必要像HDFS的运行一个独立的ZKFC进程,因为嵌入到RM的主备选举模块扮演失败探测和leader选举,替换了独立的ZKFC进程。
Client, ApplicationMaster and NodeManager on RM failover
当有多个RM时,client和node使用的配置文件(yarn-site.xml)将列出所有RM。Client,ApplicationMasters(AMs)和NodeManagers(NMs)采用round-robin的方式尝试连接RM,直到命中Active的RM。如果这个Active宕机,他们会继续采用 round-robin 的方式轮询直到命中新的Active。默认的重试逻辑实现是
org.apache.hadoop.yarn.client.ConfiguredRMFailoverProxyProvider。你可以通过实现org.apache.hadoop.yarn.client.ConfiguredRMFailoverProxyProvider并设置yarn.client.failover-proxy-provider的值为这个类的类名,以此覆写相应逻辑。
恢复之前Active-RM的状态
在
ResourceManger Restart开启之后,被提升为Active状态的RM依赖RM restart特性会加载上一个Active的RM的内部状态并尽可能继续处理其剩余的工作。之前提交到RM的每一个Application都会催生一个新的attempt 。Applications可以周期性的设置checkpoint以此避免丢失工作内容。state-store必须对主备RM都可见。当前有两种RMStateStore持久化实现-FileSystemRMStateStore 和ZKRMStateStore.
ZKRMStateStore
隐性的允许任意时刻都可以对RM进行写操作,因此其被作为在HA集群中推荐使用的存储。在使用ZKRMStateStore时,没有必要独立解决潜在的脑裂问题。在使用ZKRMStateStore时,建议在Zookeeper集群中不要设置“
zookeeper.DigestAuthenticationProvider.superDigest
”属性,以确保zookeeper管理员不能具有访问YARN application/用户的证书信息。
部署
配置
灾备的大部分功能都可以通过各种各样的配置属性进行调整。以下是一个重要的说明列表。
Configuration Properties | Description |
yarn.resourcemanager.zk-address | zk的地址。用于 state-store和嵌入式的leader选举。 |
yarn.resourcemanager.ha.enabled | 启用RM的HA。 |
yarn.resourcemanager.ha.rm-ids | RM的逻辑id列表,如 “rm1,rm2”. |
yarn.resourcemanager.hostname.rm-id | 对每个rm-id,指定rm对应的hostname。或者,可以指定每个RM的服务地址。 |
yarn.resourcemanager.address.rm-id | 指定每一个rm-id的host:port。如果设置则会覆盖 yarn.resourcemanager.hostname.rm-id设置的hostname. |
yarn.resourcemanager.scheduler.address.rm-id | 对每个rm-id指定applicationMaster获取资源的调度器地址-host:port。如果设置,会覆盖yarn.resourcemanager.hostname.rm-id设置的hostname。 |
yarn.resourcemanager.resource-tracker.address.rm-id | 对每个rm-id设置NodeManager连接的host:port。如果设置, 会覆盖yarn.resourcemanager.hostname.rm-id设置的hostname。 |
yarn.resourcemanager.admin.address.rm-id | 对每个rm-id指定管理命令的host:port. 如果设置, 会覆盖yarn.resourcemanager.hostname.rm-id设置的hostname。 |
yarn.resourcemanager.webapp.address.rm-id | 对每个rm-id,指定RM webapp对应的host:port。如果你设置了 yarn.http.policy为HTTPS_ONLY,则不需要本属性。 如果设置, 会覆盖yarn.resourcemanager.hostname.rm-id设置的hostname。 |
yarn.resourcemanager.webapp.https.address.rm-id | 对每个rm-id指定RM https webapp相应的host:port。如果你设定了 yarn.http.policy 为HTTP_ONLY,那么你就不需要该属性。 如果设置, 会覆盖yarn.resourcemanager.hostname.rm-id设置的hostname。 |
yarn.resourcemanager.ha.id | RM在集群中的标识。这是可选的;然而如果设置,管理员需要确保在配置中所有的RM都有唯一的标识。 |
yarn.resourcemanager.ha.automatic-failover.enabled | 启用自动灾备。默认只有在HA启用的时候才启动。 |
yarn.resourcemanager.ha.automatic-failover.embedded | 当自动灾备启用之后,使用嵌入式的leader选举Active RM。默认只在HA启用后该项才启用。 |
yarn.resourcemanager.cluster-id | 集群标识。 |
yarn.client.failover-proxy-provider | Client、AMs和NMs应对Active RM failover使用的class。 |
yarn.client.failover-max-attempts | FailoverProxyProvider 的最大尝试次数。 |
yarn.client.failover-sleep-base-ms | 用于计算Failover之间的delay指数的sleep基数(毫秒为单位) |
yarn.client.failover-sleep-max-ms | failover之间的最大sleep时间(毫秒为单位)。 |
yarn.client.failover-retries | 每个attempt 重试连接 ResourceManager的次数。 |
yarn.client.failover-retries-on-socket-timeouts | 每个 attempt 连接到ResourceManager socket超时的次数。 |
样例配置
这里是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>yarn.resourcemanager.zk-address</name> <value>zk1:2181,zk2:2181,zk3:2181</value> </property>
管理命令
yarn rmadmin有一小部分HA特定的命令选项,用来检查RM的健康的或者状态,以及在Active/StandyBy之间切换。HA的这些命令采用RM的服务Id(在
yarn.resourcemanager.ha.rm-ids
中设置的)作为参数
$ 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.
ResourceManager Web UI services
假定一个standby RM是运行的,该Standby自动重定向所有的web请求到Active,除了“About”页面之外。
Web Services
假定一个standby RM是运行中,RM web-service在请求到standy时会自动重定向到Active RM。