HDInsight Oozie 4.2.0.2.5 Spark2 Action Jackson冲突问题咨询
解决Oozie Spark Action中的Jackson依赖冲突问题
我之前在HDP2.6环境下按照官方文档配置Oozie Spark2 Action时,也碰到过一模一样的Jackson依赖冲突问题——本质是Oozie自带的Jackson版本(通常是1.x系列)和Spark2依赖的Jackson 2.x系列版本不兼容,导致类加载异常。给你几个亲测有效的解决方案:
方案1:配置Spark优先加载自身依赖(推荐,无集群修改风险)
在你的workflow.xml的<spark>节点里添加Spark配置,强制让Driver和Executor优先加载用户作业的依赖(也就是Spark自带的Jackson版本):
<spark xmlns="uri:oozie:spark-action:0.1"> <!-- 原有配置:job-tracker、name-node等 --> <configuration> <property> <name>spark.driver.userClassPathFirst</name> <value>true</value> </property> <property> <name>spark.executor.userClassPathFirst</name> <value>true</value> </property> </configuration> <!-- 其他配置:main-class、jar等 --> </spark>
这个配置会让Spark跳过Oozie提供的旧版Jackson,直接使用自身依赖的2.x版本,不需要改动集群共享库,风险最低。
方案2:替换Oozie Spark共享库中的Jackson依赖
如果方案1无效,可以直接修改Oozie的Spark共享库,统一Jackson版本:
- 找到Oozie的Spark共享库目录,通常路径是
/usr/hdp/current/oozie-server/share/lib/lib_<时间戳>/spark(<时间戳>是Oozie共享库生成的随机字符串) - 删除目录中所有旧版Jackson jar包:比如
jackson-core-asl-*.jar、jackson-mapper-asl-*.jar - 从Spark的安装目录(
/usr/hdp/current/spark2/jars)复制对应的Jackson 2.x jar包到该目录:jackson-core-2.6.7.jar、jackson-databind-2.6.7.jar、jackson-annotations-2.6.7.jar(HDP2.6的Spark2对应的Jackson版本一般是2.6.7,可根据实际情况调整) - 重启Oozie服务,让新的共享库生效
方案3:提交作业时显式指定Jackson依赖并排除冲突包
在workflow.xml的<spark-opts>里显式指定要使用的Jackson jar包,同时排除Oozie自带的旧版Jackson:
<spark xmlns="uri:oozie:spark-action:0.1"> <!-- 原有配置 --> <spark-opts>--jars hdfs:///path/to/jackson-core-2.6.7.jar,hdfs:///path/to/jackson-databind-2.6.7.jar,hdfs:///path/to/jackson-annotations-2.6.7.jar --exclude-packages org.codehaus.jackson</spark-opts> </spark>
注意把hdfs:///path/to/替换成你上传Jackson jar包到HDFS的实际路径,--exclude-packages会让Spark忽略Oozie提供的org.codehaus.jackson包(旧版Jackson的包名)。
额外注意事项
- 尽量优先用方案1,避免修改集群共享库带来的影响
- 如果你的作业代码里有自定义的Jackson依赖,要确保和Spark使用的版本一致
- 可以通过
spark-submit --verbose命令查看Spark实际加载的依赖版本,验证冲突是否解决
内容的提问来源于stack exchange,提问作者Adam Pitt
相关产品推荐
相关产品推荐

