Zeppelin添加Jar依赖后运行Spark代码报错问题咨询
问题根源:依赖版本冲突(Jackson库版本不兼容)
这个问题百分百是依赖版本冲突搞的鬼,尤其是你新增的那个Jar包十有八九自带了低版本的Jackson库(就是报错里的2.5.4),和Spark本身依赖的Jackson版本不兼容,才引发了这一连串奇怪的错误。
为什么会出现两个不同的错误?
首次执行报错
com.fasterxml.jackson.databind.JsonMappingException: Jackson version is too old 2.5.4:
Spark内部依赖的Jackson版本远高于2.5.4(比如Spark 2.x通常用2.6.x及以上,3.x更是用到2.10+)。当你引入的Jar把旧版本Jackson塞进了类路径,Spark加载JSON解析器时会优先使用这个旧版本,而旧版本缺少Spark需要的API,直接抛出版本过低的错误。二次执行报错
java.lang.NoClassDefFoundError: Could not initialize class org.apache.spark.rdd.RDDOperationScope$:
第一次报错后,类加载器已经尝试加载了冲突的Jackson类,导致后续Spark核心类(比如RDD相关的初始化逻辑)因为依赖的Jackson类加载异常,进而触发类初始化失败。简单说就是类加载环境已经被破坏了,不是干净的新环境,所以错误类型变了。
解决建议
- 检查Jar包的依赖树:用构建工具查看你新增的Jar是否自带了Jackson 2.5.4。比如Maven可以执行
mvn dependency:tree,Gradle执行gradle dependencies,找到Jackson相关的依赖项。 - 排除Jar中的Jackson传递依赖:如果这个Jar是你自己构建的,直接在构建脚本里排除Jackson的传递依赖,让它使用Spark自带的版本:
- Maven示例:
<dependency> <groupId>你的Jar的GroupId</groupId> <artifactId>你的Jar的ArtifactId</artifactId> <version>版本号</version> <exclusions> <exclusion> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </exclusion> <exclusion> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> </exclusion> <exclusion> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> </exclusion> </exclusions> </dependency> - Gradle示例:
implementation('你的Jar的GroupId:你的Jar的ArtifactId:版本号') { exclude group: 'com.fasterxml.jackson.core', module: 'jackson-databind' exclude group: 'com.fasterxml.jackson.core', module: 'jackson-core' exclude group: 'com.fasterxml.jackson.core', module: 'jackson-annotations' }
- Maven示例:
- 调整Zeppelin的Interpreter依赖设置:如果没办法修改Jar包,可以在Zeppelin的Spark Interpreter设置里,把冲突的Jackson依赖标记为
provided,强制它使用Spark集群自带的版本。
内容的提问来源于stack exchange,提问作者Mpizos Dimitris
相关产品推荐
相关产品推荐

