CDH从5.5.4升级至5.13.0后Spark作业因Jackson依赖失败
我之前帮不少用户处理过这类CDH升级后的Spark兼容性问题,咱们先把问题拆解清楚:
问题根源
你遇到的java.lang.VerifyError本质是类兼容性冲突:CDH 5.5.4到5.13.0的升级中,Spark 1.6.0依赖的Jackson版本(尤其是com.fasterxml.jackson.databind)和Codahale Metrics的MetricsModule版本不匹配,导致MetricsModule无法被识别为jackson.databind.Module的实现类,触发了字节码验证错误。而Oozie启动器状态时好时坏,是因为类加载顺序的随机性——有时候集群的正确类先加载就成功,有时候用户作业带的旧依赖先加载就失败。
分步解决方案
1. 清理作业依赖,排除冲突Jar包
检查你的Spark作业打包配置(Maven/Gradle),排除掉所有和Jackson、Codahale Metrics相关的依赖,改用CDH集群提供的版本:
- Maven示例配置:
<dependencies> <!-- Spark核心依赖,设置为provided避免打包进Jar --> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-core_2.10</artifactId> <version>1.6.0-cdh5.13.0</version> <scope>provided</scope> <exclusions> <exclusion> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </exclusion> <exclusion> <groupId>com.codahale.metrics</groupId> <artifactId>metrics-json</artifactId> </exclusion> <exclusion> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> </exclusion> </exclusions> </dependency> <!-- 其他业务依赖同理,排除冲突的Jackson/Metrics组件 --> </dependencies>
- Gradle示例配置:
dependencies { provided "org.apache.spark:spark-core_2.10:1.6.0-cdh5.13.0" // 排除冲突依赖 configurations.all { exclude group: 'com.fasterxml.jackson.core', module: 'jackson-databind' exclude group: 'com.codahale.metrics', module: 'metrics-json' } }
2. 配置Oozie使用集群系统库
在Oozie的job.properties里添加以下配置,强制Oozie使用CDH 5.13.0的Spark环境,避免加载旧依赖:
oozie.use.system.libpath=true spark.yarn.jars=hdfs:///path/to/cdh5.13.0/spark/jars/*.jar
注意替换hdfs:///path/to/cdh5.13.0/spark/jars/为你集群中Spark Jar包的实际HDFS路径。
3. 重新打包作业,清理旧Jar
执行mvn clean package(或Gradle的clean build),确保打包后的Jar包中不包含任何Jackson、Codahale Metrics的Jar文件。可以用jar tf your-job.jar命令检查打包内容,确认没有冲突的Jar。
4. 检查Spark集群配置
确保Spark的以下配置没有被错误修改:
spark.driver.userClassPathFirst=false(默认值,不要改成true,否则用户Jar的类会优先加载,覆盖集群版本)spark.executor.userClassPathFirst=false
如果之前为了其他需求修改过这两个参数,改回默认值即可。
验证效果
按照以上步骤处理后,重新提交Oozie作业:
- Jackson的类兼容性问题会被解决,
VerifyError不再出现 - Oozie启动器的状态会稳定为成功,因为类加载冲突被彻底消除
内容的提问来源于stack exchange,提问作者Fawze Abujaber

