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

Apache Spark与Hadoop的Jar包冲突问题求助

解决Spark 2.3.0 + Hadoop 3.1.0 YARN提交时的Jackson版本冲突问题

这种版本冲突在Spark和Hadoop混搭部署时特别常见,我来帮你梳理下问题根源和可行的解决办法:

问题根源拆解

你遇到的两个问题其实是连锁反应:

  1. 最初的Could not find or load main class org.apache.spark.deploy.yarn.ApplicationMaster:因为SPARK_DIST_CLASSPATH只包含了Hadoop的类路径,YARN的ApplicationMaster找不到Spark核心类,所以必须把Spark的jar包加入类路径。
  2. 加入Spark jars后出现的JsonMappingException: Incompatible Jackson version:Hadoop 3.1.0自带Jackson 2.7.8,而Spark 2.3.0依赖的是Jackson 2.6.7,两个版本的Jackson类同时存在于类路径中,导致类加载冲突。

下面是两种经过验证的解决方案:

方案一:替换Spark的Jackson包为Hadoop兼容版本

直接把Spark中旧版本的Jackson包换成Hadoop使用的2.7.8版本,从根源上消除版本差异:

  1. 先删除Spark jars目录下的Jackson 2.6.7相关包:
    cd /usr/local/spark/jars
    rm jackson-annotations-2.6.7.jar jackson-core-2.6.7.jar jackson-databind-2.6.7.jar jackson-module-scala_2.11-2.6.7.jar
    
  2. 从Hadoop的lib目录复制对应的Jackson 2.7.8包到Spark jars:
    cp /usr/local/hadoop/share/hadoop/common/lib/jackson-annotations-2.7.8.jar \
       /usr/local/hadoop/share/hadoop/common/lib/jackson-core-2.7.8.jar \
       /usr/local/hadoop/share/hadoop/common/lib/jackson-databind-2.7.8.jar \
       /usr/local/spark/jars/
    
  3. 补充Spark专属的Jackson Scala模块:Hadoop没有这个包,需要下载对应版本的jackson-module-scala_2.11-2.7.8.jar(注意要和Spark的Scala版本2.11匹配),放到/usr/local/spark/jars目录。

方案二:调整类加载顺序,优先使用Hadoop的Jackson包

如果不想替换jar包,可以通过修改SPARK_DIST_CLASSPATH的配置,让Hadoop的类优先加载,同时排除Spark中冲突的Jackson包:
修改spark-env.sh中的配置为:

# 先获取Hadoop类路径,再添加Spark jars但排除冲突的Jackson包
export SPARK_DIST_CLASSPATH=$(/usr/local/hadoop/bin/hadoop classpath):$(echo /usr/local/spark/jars/*.jar | sed 's/jackson-\(annotations\|core\|databind\)-2.6.7.jar//g' | sed 's/jackson-module-scala_2.11-2.6.7.jar//g')

这样Spark会优先使用Hadoop提供的Jackson 2.7.8,避免版本冲突。

验证解决方案

完成配置后,提交一个简单的Spark应用测试是否正常:

spark-submit --master yarn --deploy-mode cluster --class org.apache.spark.examples.SparkPi /usr/local/spark/examples/jars/spark-examples_2.11-2.3.0.jar 10

如果能正常输出Pi的近似值,说明问题已经解决。

额外建议

后续如果有条件,尽量选择官方兼容的Spark和Hadoop版本组合:Spark 2.3.0官方推荐的Hadoop版本是2.6.x~2.8.x,Hadoop 3.1.0属于较新的版本,兼容性有限。可以考虑升级Spark到2.4.x(官方支持Hadoop 3.x)或者降级Hadoop到2.8.x,从根本上减少这类兼容性问题。

内容的提问来源于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 09:29:34