ZooKeeper节点数据量限制引起的Hadoop YARN ResourceManager崩溃原因分析(三)

阿里云协同办公工具Teambition 0元试用>>> hot3.png

这个问题又让我们碰到了,发生次数不频繁但是一旦发生就会造成ResourceManager服务崩溃、ZK注册watch过多等问题。不彻底解决这个问题心中一直是个梗,所以基于前两次的分析和阅读社区最新版Hadoop 3.2.1代码之后,给生产环境YARNpatch最终解决这个问题。对于疑难问题,每遇到一次就有一次不同的感悟,接下来是我本次分析和解决该问题的过程记录。前两次解决和分析该问题的记录如下:

环境

  • Hadoop版本:Apache Hadoop 2.6.3
  • ZooKeeper版本:ZooKeeper 3.4.10
  • 两个ResourceManager节点:主节点RM01,从节点RM02

问题原因

这个问题很难复现,前两次一直没找到产生该问题的原因,打了patch之后,我们在日志中发现,产生该问题主要是由于部分异常任务导致的,日志如下:

2020-04-28 10:05:54 INFO  org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore:768 - Application update attemptState data size for /rmstore/ZKRMStateRoot/RMAppRoot/application_1587969707206_16259/appattempt_1587969707206_16259_000001 is 20266528. Exceed the maximum allowed 3145728 size. ApplicationAttemptState info: ApplicationAttemptState{attemptId=appattempt_1587969707206_16259_000001, diagnostics='User class threw exception: java.lang.RuntimeException: org.apache.spark.SparkException: Job aborted due to stage failure: Task 15 in stage 2.0 failed 4 times, most recent failure: Lost task 15.3 in stage 2.0 (TID 4224, datanode44.bi): java.util.concurrent.ExecutionException: java.lang.Exception: failed to compile: org.codehaus.janino.JaninoRuntimeException: Code of method "(Lorg/apache/spark/sql/catalyst/expressions/GeneratedClass$SpecificUnsafeProjection;Lorg/apache/spark/sql/catalyst/InternalRow;)V" of class "org.apache.spark.sql.catalyst.expressions.GeneratedClass$SpecificUnsafeProjection" grows beyond 64 KB
/* 001 */ public java.lang.Object generate(Object[] references) {
/* 002 */   return new SpecificUnsafeProjection(references);
/* 003 */ }
/* 004 */
/* 005 */ class SpecificUnsafeProjection extends org.apache.spark.sql.catalyst.expressions.UnsafeProjection {
/* 006 */
/* 007 */   private Object[] references;
/* 008 */   private scala.collection.immutable.Set hset;
/* 009 */   private boolean hasNull;
/* 010 */   private UnsafeRow result;
/* 011 */   private org.apache.spark.sql.catalyst.expressions.codegen.BufferHolder holder;
/* 012 */   private org.apache.spark.sql.catalyst.expressions.codegen.UnsafeRowWriter rowWriter;

当任务出现异常时,YARN会保存任务的异常信息,当异常信息很多时,YARNZK保存任务状态的数据量就会超过ZK的限制。从日志中可以看出,出现异常的Spark任务状态数据是20266528字节,也就是19MB,远远超过了我们所设置的3MB。在YARN监控界面上可以看到该任务的异常信息有20万行:

启用Hadoop YARNResourceManager (RM) 高可用(HA)模式需要以下几个步骤: 1. **配置环境**: - 确保你有节点,其中一个作为名称节点(NodeManager),一个作为 ResourceManager 主服务器(Standby RM),另一个作为备选的ResourceManager(Standby RM)。 - 安装并配置Hadoop集群,安装必要的依赖软件。 2. **修改配置文件**: - 更新`yarn-site.xml`文件: - 设置`yarn.resourcemanager.ha.enabled`为`true`。 - 添加`yarn.resourcemanager.hostname`指明每个RM节点的主机名。 - `yarn.resourcemanager.zk-address`指定ZooKeeper的地址,这是HA协调的基础。 - `yarn.resourcemanager.address`设置为主RM和Standby RM的服务端口。 - 在`hdfs-site.xml`中可能也需要配置`ha.fencing.methods`等与HA相关的属性。 3. **启动服务**: - 启动NameNode、 Zookeeper以及两个RM节点,分别为主RM(`yarn-resourcemanager`)和服务代理(`yarn-proxyserver`)。 - 对于 Standby RM,需要配置为只读模式(`yarn.resourcemanager.recovery.enabled=true`), 并监听不同的端口。 4. **激活和配置监控**: - 使用`yarnadmin`工具进行初始化: ``` yarn initrm [zk_quorum] <path_to_hadoop_home> ``` - 激活RM高可用: ``` yarn rmadmin -service state change standby <hostname_of_standby_rm> ``` 5. **测试和验证**: - 通过命令行或者Web UI确认HA已经启用并且可以在主备之间切换。 记住,每一步都需要谨慎处理,并确保所有更改都在生产环境前经过充分测试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值