Docker中Zeppelin+Spark运行Scala代码遇Jackson版本冲突错误
解决Zeppelin+Spark环境下Jackson Databind版本冲突问题
问题本质
这个报错是因为Scala 2.13.3要求Jackson Databind版本在2.13.0到2.14.0之间,但当前环境加载的是2.12.0版本。只有执行Action操作才触发错误,说明Spark在实际执行任务时才会拉取到冲突的依赖——大概率是Zeppelin解释器或MySQL驱动引入了低版本Jackson。
可行解决方案
1. 强制指定Jackson版本优先级
在Zeppelin的Spark解释器配置页面,找到spark.driver.extraClassPath和spark.executor.extraClassPath参数,手动绑定高版本Jackson包:
- 先进入Docker容器下载对应版本的Jar包(比如2.13.4,刚好符合版本范围):
wget https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-databind/2.13.4/jackson-databind-2.13.4.jar -P /opt/zeppelin/interpreter/spark/ - 然后在解释器配置里添加:
保存后重启Spark解释器。spark.driver.extraClassPath=/opt/zeppelin/interpreter/spark/jackson-databind-2.13.4.jar spark.executor.extraClassPath=/opt/zeppelin/interpreter/spark/jackson-databind-2.13.4.jar
2. 排除MySQL驱动的低版本Jackson依赖
如果是MySQL驱动带进来的冲突,在Zeppelin解释器的Dependencies选项卡中,添加MySQL驱动时显式排除Jackson:
mysql:mysql-connector-java:8.0.30,exclude=com.fasterxml.jackson.core:jackson-databind
读取MySQL数据的代码保持正常即可:
val df = spark.read.format("jdbc") .option("url", "jdbc:mysql://你的主机:3306/数据库名") .option("dbtable", "表名") .option("user", "用户名") .option("password", "密码") .option("driver", "com.mysql.cj.jdbc.Driver") .load()
3. 自定义Docker镜像替换Jackson版本
如果官方镜像的基础依赖本身有问题,可以构建自定义镜像替换低版本Jar:
- 编写Dockerfile:
FROM apache/zeppelin:0.10.1 RUN rm /opt/zeppelin/interpreter/spark/jackson-databind-2.12.0.jar RUN wget https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-databind/2.13.4/jackson-databind-2.13.4.jar -P /opt/zeppelin/interpreter/spark/
- 构建并运行镜像:
docker build -t custom-zeppelin:0.10.1-spark3.3 . docker run -d -p 8080:8080 custom-zeppelin:0.10.1-spark3.3
4. 定位冲突来源
先在Zeppelin中执行这段代码,查看具体哪个组件引入了2.12.0版本的Jackson:
import org.apache.spark.SparkContext val sc = SparkContext.getOrCreate() sc.listJars().filter(_.contains("jackson")).foreach(println)
找到对应的Jar包后,直接替换或删除低版本文件即可。
内容的提问来源于stack exchange,提问作者andysakov1958
相关产品推荐
相关产品推荐

