---
layout: post
title: YARN上的ResourceManager的高可用方案
category: 技术
tags: Hadoop
keywords:
description: YARN上的ResourceManager的高可用方案
---
{:toc}
## 介绍
该指南提供了对YARN上的ResourceManager(RM)的高可用概述,并详细讲解了怎样配置和使用该特性。
RM负责跟踪寄去哪上的资源,并调度应用(比如,Mapreduce任务)。在Hadoop2.4之前,RM在整个的YARN集群中存在单点故障。
高可用的特性会以主从RM对的方式增加冗余来避免单点故障。
## 架构
![YARN架构](//raw.githubusercontent.com/George5814/blog-pic/master/image/hadoop/rm-ha-overview.png)
### RM故障切换
RM的HA是通过主备架构实现的-在任何时间点上都有一个RM是活跃节点另一个或多个处于备用模式等待在异常发生时转换为活跃。通过管理员命令或在自动故障切换开启时整合的故障切换控制器都可以触发切换到活跃状态。
#### 手动故障切换
当自动故障切换未开启时,管理员不得不手动将RM中的一个切换为活跃状态。为了一个节点到另一个节点的故障切换,他们期望先将活跃RM切换到备用节点状态,并将一备用节点转为活跃节点。
所有这些可以使用命令`yarn rmadmin` 来完成。
#### 自动故障切换
RM有一个选项嵌入基于zookeeper的主备选择器来决定哪个RM应该是活跃的。当主节点宕机或没有响应时,另一个RM会自动被选择为活跃状态然后接管以前的任务。
**注意:**不需要在HDFS上分别运行ZKFC实例,因为嵌入在RM中的主备选择器扮演了故障切换的监测者和替代单独的ZKFC进程作为选举器。
#### RM故障切换上的客户端,ApplicationMaster 和NodeManager
当有多个RM时,客户端和节点使用的配置(`yarn-sote.xml`)希望列出所有的RM。客户端,AM和NM尝试以循环方式连接RM直到集中活跃的RM。如果活跃节点失效了,他们会重新循环轮询直到击中新的活跃节点。
默认重试的逻辑需要实现`org.apache.hadoop.yarn.client.ConfiguredRMFailoverProxyProvider`。
你可以通过实现`org.apache.hadoop.yarn.client.RMFailoverProxyProvider `来覆盖逻辑并设置`yarn.client.failover-proxy-provider`的值到该类的全限定名称。
## 恢复先前的活跃RM的状态
启用了RM的重启后,被确认为活跃状态的RM会载入RM的内部状态并根据RM的重启功能尽可能的继续从先前活跃节点失效的位置继续操作。
会为每个已经提交到RM的管理应用程序触发新的尝试。应用程序可以定期检查点避免丢失任何工作。状态存储必须对RM的主备节点都可见的。当前,有两个RMStateStore实现持久化-`FileSystemRMStateStore `和`ZKRMStateStore`。
`ZKRMStateStore`默认允许在任何时候及时写并读到一个单一RM,因此推荐将其存储在高可用的集群中。在使用`ZKRMStateStore`时,不需要单独的回避机器来解决潜在的脑裂的情况(多个RM被任务是活跃角色的情况)。当使用`ZKRMStateStore`时,不建议在ZK集群上设置`zookeeper.DigestAuthenticationProvider.superDigest`属性来确保ZK的管理员不能访问YARN应用或用户凭证数据。
## 部署
### 配置
大部分的故障切换功能可以使用多种配置属性调节。
下面的列表是必须的而且是很重要的。`yarn-defaylt.xml`携带了设置的完全列表。
可以查看[yarn-default.xml]()获得更多包括默认值在内的信息。看[RM重启]()来了解设置状态存储的信息。
|配置属性|描述|
|----|----|
|yarn.resourcemanager.zk-address |ZK仲裁的地址,用于状态存储和内嵌leader选举|
|yarn.resourcemanager.ha.enabled |启用RM的高可用|
|yarn.resourcemanager.ha.rm-ids |RM的逻辑ID列表,如:rm1,rm22|
|yarn.resourcemanager.hostname.rm-id|针对每一个rm-id,指定RM相应的主机名,另外也可以是指每个Rm的服务地址(ip地址)|
|yarn.resourcemanager.address.rm-id |针对每个rm-id,为客户端指定提交job的host和port。如果设置了,会覆盖`yarn.resourcemanager.hostname.rm-id`中设置的主机名|
|yarn.resourcemanager.scheduler.address.rm-id |针对每个rm-id,为AM指定获取资源的host和port。如果设置了,会覆盖`yarn.resourcemanager.hostname.rm-id`中设置的主机名|
|yarn.resourcemanager.resource-tracker.address.rm-id |针对每个rm-id,Nm连接的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.ha.id |RM的总标识|
|yarn.resourcemanager.ha.automatic-failover.enabled |启用自动故障切换;默认当启动高可用时就启动该配置|
|yarn.resourcemanager.ha.automatic-failover.embedded |当自动故障切换开启时,使用嵌入的leader选举来投票胡月的Rm。默认当启动高可用时就启动该配置|
|yarn.resourcemanager.cluster-id |集群的标识,确保选举为活跃的RM不是另一个集群的节点。|
|yarn.client.failover-proxy-provider|客户端,AM,NM用于故障切换到活跃RM的类|
|yarn.client.failover-max-attempts |故障切换代理提供者尝试故障切换的最大次数|
|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的重试数量的超时时间|
## 样例配置
这是RM故障切换最简单的样例设置
```xml
yarn.resourcemanager.ha.enabled
true
yarn.resourcemanager.cluster-id
cluster1
yarn.resourcemanager.ha.rm-ids
rm1,rm2
yarn.resourcemanager.hostname.rm1
master1
yarn.resourcemanager.hostname.rm2
master2
yarn.resourcemanager.webapp.address.rm1
master1:8088
yarn.resourcemanager.webapp.address.rm2
master2:8088
yarn.resourcemanager.zk-address
zk1:2181,zk2:2181,zk3:2181
```
## 示例配置
这是在实际搭建中的示例配置
```xml
yarn.nodemanager.aux-services
mapreduce_shuffle
yarn.resourcemanager.scheduler.class
org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler
yarn.log-aggregation-enable
true
yarn.resourcemanager.webapp.address
h2m1:8088
yarn.log-aggregation.retain-seconds
864000
yarn.log-aggregation.retain-seconds
764000
yarn.resourcemanager.scheduler.class
org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler
yarn.resourcemanager.zk-address
h2m1:2181,h2s1:2181,h2s2:2181
yarn.resourcemanager.ha.enabled
true
yarn.resourcemanager.cluster-id
hadoop-cluster-jingzz-rm
yarn.resourcemanager.ha.rm-ids
rm1,rm2
yarn.resourcemanager.hostname.rm1
h2m1
yarn.resourcemanager.hostname.rm2
h2s1
yarn.resourcemanager.webapp.address.rm1
h2m1:8088
yarn.resourcemanager.webapp.address.rm2
h2s1:8088
yarn.resourcemanager.ha.automatic-failover.enabled
true
yarn.resourcemanager.recovery.enabled
true
yarn.resourcemanager.store.class
org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore
````
### 管理员命令
`yarn rmadmin`有多个HA的具体命令操作来检查RM的健康和状态,并且切换主备状态。
命令中使用的HA的是在`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.
```
### RM的web界面服务
假定备用RM设置并启用,备用自动重定向所有的web请求到主节点,除非是“关于”页面。
### web Service
假定备用RM设置并启用,RM的web-service的描述在[RM的Rest API]()处,当调用一个备用RM请求会自动重定向到主RM节点。
**注意:**需要在RM的每个节点上执行`${hadoop_home}/sbin/yarn-daemon.sh --config $YARN_CONF_DIR start resourcemanager`