本文为您介绍YARN-4946引入缺陷的影响范围以及相应的修复方案。
背景信息
YARN-4946引入缺陷,YARN ResourceManager删除历史应用作业时增加了日志收集已完成的必要条件,但日志收集的状态没有保留到ResourceManager State Store中,所以重启后ResourceManager加载的历史应用都是未完成状态,无法被ResourceManager自动删除掉,造成application在ResourceManager中堆积。这部分应用达到上限(相关配置为${yarn.resourcemanager.state-store.max-completed-applications} 或${yarn.resourcemanager.max-completed-applications},默认值为10000)之后,会影响ResourceManager的调度。
具体缺陷引入的Issue为YARN-4946,详情请参见YARN-4946。
通过revert方式修复该缺陷的Issue为YARN-9571,详情请参见YARN-9571。
缺陷影响
- 缺陷影响的组件:Hadoop YARN(开启了服务高可用,并且添加了Zookeeper服务)。
- 缺陷级别:严重,建议修复,集群长时间运行重启后会导致集群不可用。
- 缺陷发生现象:ResourceManager日志一直打印“Application should be expired, max number of completed apps kept in memory met: maxCompletedAppsInMemory = 10000, but not removing app XXX from memory as log aggregation have not finished yet.”,导致YARN ResourceManager不可用,或者出现ResourceManager重启之后长时间不可用的情况。
缺陷修复方案
您需要将E-MapReduce集群中包含缺陷的Hadoop YARN ResourceManager的JAR包替换掉,然后重启ResourceManager服务,重启服务时先处理Standby ResourceManager,再处理Active ResourceManager。
该修复方案:
- 适用于EMR的4.6.0、4.7.0、4.8.0、4.9.0、5.1.0、5.2.0和5.2.1版本。说明 对应Hadoop的3.2.1版本。
- 执行该修复方案后,需要重启对应的组件。重启组件可能会导致作业失败,所以建议业务低峰期时执行。
修复流程
按照先处理Standby ResourceManager,再处理Active ResourceManager的顺序,通过JAR包替换的方式修复ResourceManager组件缺陷。
重要
- 替换过程中,重启一个ResourceManager待正常运行之后再重启另外一个ResoureManager。
- 如果集群没有开启高可用,则无需执行该修复流程。
- 单击hadoop-yarn-server-resourcemanager-3.2.1.jar下载YARN ResourceManager JAR包。
- 登录EMR集群的Master节点,将下载好的JAR包放在Hadoop的软件安装目录下。本示例是在/usr/lib/hadoop-current/share/hadoop/yarn/目录。
- 备份旧的JAR包,并将新包拷贝到相应位置。
mv $HADOOP_HOME/share/hadoop/yarn/hadoop-yarn-server-resourcemanager-3.2.1.jar /tmp/ cp hadoop-yarn-server-resourcemanager-3.2.1.jar $HADOOP_HOME/share/hadoop/yarn/命令中的$HADOOP_HOME为Hadoop的安装目录。本文示例中Hadoop的安装目录为/usr/lib/hadoop-current。
- 重启YARN ResourceManager服务。观察ResourceManager重启情况,如果重启之后ResourceManager日志不再提示“but not removing app XXX from memory as log aggregation have not finished yet.”的问题,并且作业可以正常提交,则说明修复成功。
- 在控制台查找Active ResourceManager,重启YARN ResourceManager服务。
回滚流程
如果修复过程中遇到问题需要回滚,则可以执行以下命令,使用备份路径下的旧包替换掉补丁包,再重启该节点上的YARN ResourceManager。
cp /tmp/hadoop-yarn-server-resourcemanager-3.2.1.jar $HADOOP_HOME/share/hadoop/yarn/