Spark提交任务至YARN触发NettyMemoryMetrics的NoSuchMethodError错误
解决Spark 2.3.0(无Hadoop版)在YARN环境中Netty版本冲突的问题
这个报错的核心原因就是Netty版本冲突,咱们来拆解清楚:
你用的Spark 2.3.0自带的是netty-all-4.1.17.Final.jar,而Hadoop 2.7.6里混着netty-3.6.2.Final.jar和netty-all-4.0.23.Final.jar。报错里的PooledByteBufAllocator.metric()方法是Netty 4.1才新增的API,Hadoop 2.7.x里的Netty 4.0版本根本没有这个方法。再看你的SPARK_DIST_CLASSPATH配置,Hadoop的classpath放在了Spark jars前面,导致JVM先加载了Hadoop的旧版Netty,自然就找不到这个方法了。
下面是几个可行的解决方案,按优先级排序:
1. 调整Classpath加载顺序(最简单有效)
修改spark-env.sh里的SPARK_DIST_CLASSPATH配置,把Spark的jars放在最前面,让高版本Netty优先被加载:
export SPARK_DIST_CLASSPATH=/usr/local/spark/jars/*:$(/usr/local/hadoop/bin/hadoop classpath)
修改后重启Spark相关服务,再提交任务测试。
2. 排除Hadoop中的冲突Netty包
如果调整顺序后还是有问题,可以手动移除Hadoop中与Spark冲突的Netty jar(注意先备份,避免影响Hadoop自身运行):
- 删除Hadoop下的
netty-all-4.0.23.Final.jar(比如hadoop-2.7.6/share/hadoop/hdfs/lib/netty-all-4.0.23.Final.jar等路径下的) - 保留Hadoop的
netty-3.6.2.Final.jar其实影响不大,因为Spark主要用的是Netty 4.x,但如果担心可以一并移除(不过Hadoop的部分组件可能依赖3.x版本,建议先测试)
3. 换用官方预编译的Spark+Hadoop组合
最省心的方式是直接下载Spark官方预编译好对应Hadoop版本的包,比如spark-2.3.0-bin-hadoop2.7.tgz。官方已经帮你处理好了所有依赖冲突,不需要手动调整classpath。
另外,给你一个官方验证过的稳定组合参考:
- Spark 2.3.0 + Hadoop 2.7.7(比2.7.6修复了一些小问题,兼容性更好)
最后可以用Spark官方的Pi示例验证修复效果:
cd /usr/local/spark ./bin/spark-submit --class org.apache.spark.examples.SparkPi \ --master yarn \ --deploy-mode cluster \ examples/jars/spark-examples_2.11-2.3.0.jar \ 10
内容的提问来源于stack exchange,提问作者Windsaw
相关产品推荐
相关产品推荐

