升级HDP 2.6.5后部分节点Yarn无法启动Application Master
问题根源与解决方案
这个java.lang.NoSuchMethodError的核心原因是集群节点间Hadoop YARN相关Jar包版本不一致,具体来说是YarnProtos$ResourceProtoOrBuilder.getMemory()这个方法的签名或存在性在不同Hadoop版本中发生了变化——HDP 2.6.5对应的Hadoop版本是2.7.3,而报错的节点大概率残留了更低版本的YARN protobuf相关Jar,导致类加载时找不到正确的方法实现。
结合你描述的"3个节点中2个报错、1个正常"的现象,说明这两个节点的YARN/Spark类路径存在旧版本依赖,下面是具体的排查和修复步骤:
1. 确认所有节点的HDP组件版本一致
在每个节点上执行以下命令,检查组件版本:
hdp-select status
重点确认hadoop-yarn-nodemanager、hadoop-yarn-resourcemanager、spark2-client这些组件的版本都是2.6.5.x-x(具体版本号根据你的HDP安装包而定)。如果某个节点的组件版本不对,重新运行HDP升级流程,确保该节点的所有依赖包都被正确更新。
2. 检查YARN类路径中的Jar包合法性
在报错节点上执行yarn classpath,查看输出中的关键Jar包路径:
- 找到
yarn-api.jar、yarn-common.jar、hadoop-common.jar这几个Jar的位置,确认它们都来自HDP2.6.5的安装目录(比如/usr/hdp/2.6.5.x-x/hadoop-yarn/、/usr/hdp/2.6.5.x-x/hadoop-common/)。 - 如果发现输出中有旧版本的HDP目录(比如
/usr/hdp/2.5.x-x/)或者自定义Hadoop目录(比如/usr/local/hadoop),说明环境变量或YARN配置引入了旧依赖:- 检查用户的
~/.bashrc和系统的/etc/profile,确认HADOOP_HOME、YARN_HOME都指向HDP2.6.5的正确路径。 - 打开YARN的配置文件
/etc/hadoop/conf/yarn-env.sh,检查YARN_CLASSPATH变量,移除所有指向旧版本Jar的配置项。
- 检查用户的
3. 确保Spark的Hadoop依赖配置正确
对于Spark2,检查以下配置:
- 打开
/etc/spark2/conf/spark-env.sh,确认SPARK_DIST_CLASSPATH是动态获取Hadoop类路径的:
避免硬编码旧版本的Hadoop路径。export SPARK_DIST_CLASSPATH=$(hadoop classpath) - 查看
/etc/spark2/conf/spark-defaults.conf中的spark.yarn.jars配置,确保它指向的是HDP2.6.5的Spark和Hadoop Jar包,没有引用旧版本资源。
4. 清理缓存并重启服务
在报错节点上执行以下操作:
# 清理YARN缓存目录 rm -rf /var/log/hadoop-yarn/cache/* # 清理Spark临时文件 rm -rf /tmp/spark-* # 重启YARN和Spark相关服务 sudo systemctl restart hadoop-yarn-nodemanager sudo systemctl restart spark2-client
如果你的集群是用Ambari管理的,也可以通过Ambari界面重启对应的服务,确保配置生效。
5. 验证修复效果
重新运行你的测试脚本,分别测试cluster和client部署模式:
/usr/bin/spark-submit \ --master yarn \ --deploy-mode cluster \ --name 'test script' \ /opt/test/youdmp/test/script.py
如果所有节点都能正常运行,说明问题已经解决。
内容的提问来源于stack exchange,提问作者skarpov
相关产品推荐
相关产品推荐

