YARN High Availablity

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

posted @ 2019-05-05 13:42  ZacksTang  阅读(888)  评论(0编辑  收藏  举报