You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 10:09:09