问题

近期需将集群hadoop版本从2.5.0-cdh5.3.2平滑升级至2.6.0-cdh5.10.0,升级过程需保证Application稳定性,在此介绍YARN的两个相关特性ResourceManager Restart与NodeManager Restart,以及我们在实战升级中遇到的问题及解决方案。

方案

1. ResourceManager Restart

主要思路为RM持久化Application/Attempt状态到外部存储,重启后从外部存储加载恢复状态,确保Application不挂。这个Feature分为三个阶段:

  1. Hadoop 2.4.0之前:重启RM,所有Application均挂掉(Application稳定性极差)
  2. Hadoop 2.4.0 ~ 2.6.0:已经成功的Container无需重算,正在运行的AM、Container会挂掉,但Application整体不挂(Application稳定性可以保证,但受AM、Container挂掉需进行重算,Application耗时加长,性能变差)
  3. Hadoop 2.6.0之后:正在运行地AM、Container均不会挂掉,RM重启后会重新接管(Application稳定性、性能理论上不受任何影响)

对于RM HA,必须选择持久化至ZK,样例配置如下:

<property>
  <name>yarn.resourcemanager.recovery.enabled</name>
  <value>true</value>
</property>
<property>
  <name>yarn.resourcemanager.work-preserving-recovery.enabled</name>
  <value>true</value>
</property>
<property>
  <name>yarn.resourcemanager.store.class</name>
  <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>
<property>
  <name>yarn.resourcemanager.zk-address</name>
  <value>${zkaddress}</value>
</property>
<property>
  <name>yarn.resourcemanager.zk-state-store.parent-path</name>
  <value>/rmstore</value>
</property>

2. NodeManager Restart

与RM Restart类似,NodeManager持久化Application/Attempt状态至本地文件系统,重启后从外部存储加载恢复状态,确保正在运行地Container不挂。样例配置如下:

<property>
  <name>yarn.nodemanager.recovery.enabled</name>
  <value>true</value>
</property>
<property>
  <name>yarn.nodemanager.recovery.dir</name>
  <value>/search/data/recovery</value>
</property>

3. Hadoop版本兼容性问题

经过测试发现,原生2.5.0-cdh5.3.2版本与2.6.0-cdh5.7.0存在兼容性问题,我们进行了修改使得升级能够进行,主要有如下两点:

  1. MR框架中,2.6.0-cdh5.7.0中jvmID由int变为long类型,存在兼容性问题。解决方案,将新版本long改为int即可。
  2. 2.6.0-cdh5.7.0中新增NodeHeartbeatRequest.setLogAggregationReportsForApps协议,若开启logAggregationEnabled配置则会触发,导致兼容性问题。解决方案,将新版本setLogAggregationReportsForApps调用干掉即可。

由于2.5.0-cdh5.3.2的ResourceManager Restart功能尚不完善,故在升级2.6.0-cdh5.10.0的过程中重启RM会导致正在运行地AM、Container挂掉,但Application基本可以保证不挂(AM默认挂2次整个Application挂掉,可将yarn.resourcemanager.am.max-attempts参数适当调大,以保证Application整体的稳定性)。在升级至2.6.0-cdh5.10.0后,重启RM、NM均不再会导致AM、Container挂掉。