You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

AWS Glue作业中Jackson依赖版本冲突及方法缺失问题排查

解决AWS Glue作业中scala-maxmind-iplookups的Jackson版本冲突问题

我来帮你搞定这个头疼的Jackson版本冲突问题——这在AWS Glue里搭配第三方库时简直是家常便饭。咱们先理清楚问题根源,再给出具体的解决方案:

问题回顾

你在AWS Glue作业中使用scala-maxmind-iplookups库,用sbt-assembly打包包含所有依赖的Jar时遇到两种错误:

  • 当用dependencyOverrides指定Jackson 2.9.3版本时,触发Incompatible Jackson version: 2.9.3错误
  • 当尝试排除Jackson依赖时,又出现NoSuchMethodError: com.fasterxml.jackson.databind.node.ArrayNode.<init>(...)错误

根源分析

AWS Glue本身内置了特定版本的Jackson库:

  • Glue 1.x/2.x默认使用Jackson 2.6.7
  • Glue 3.x默认使用Jackson 2.10.5

你的问题出在版本不兼容:

  1. 强行指定2.9.3时,和Glue内置的旧版本Jackson冲突,引发版本不匹配错误
  2. 完全排除Jackson依赖后,scala-maxmind-iplookups需要的Jackson方法在Glue的旧版本中不存在,导致方法缺失错误

解决方案:对齐Glue的Jackson版本

核心思路是让你的Jar兼容Glue内置的Jackson版本,而不是强行覆盖或排除。具体步骤如下:

1. 修改sbt配置,对齐Jackson版本

build.sbt中添加dependencyOverrides,强制所有依赖使用和Glue一致的Jackson版本:

针对Glue 1.x/2.x:

dependencyOverrides ++= Seq(
  "com.fasterxml.jackson.core" % "jackson-core" % "2.6.7",
  "com.fasterxml.jackson.core" % "jackson-databind" % "2.6.7",
  "com.fasterxml.jackson.core" % "jackson-annotations" % "2.6.7",
  "com.fasterxml.jackson.module" %% "jackson-module-scala" % "2.6.7"
)

针对Glue 3.x:

dependencyOverrides ++= Seq(
  "com.fasterxml.jackson.core" % "jackson-core" % "2.10.5",
  "com.fasterxml.jackson.core" % "jackson-databind" % "2.10.5",
  "com.fasterxml.jackson.core" % "jackson-annotations" % "2.10.5",
  "com.fasterxml.jackson.module" %% "jackson-module-scala" % "2.10.5"
)

2. 配置sbt-assembly的合并策略

Jackson的模块服务文件可能会冲突,需要在assembly配置中添加合并策略,避免打包时丢失必要的配置:

build.sbt中添加:

assemblyMergeStrategy in assembly := {
  case PathList("META-INF", "services", "com.fasterxml.jackson.databind.Module") => MergeStrategy.concat
  case x =>
    val defaultStrategy = (assemblyMergeStrategy in assembly).value
    defaultStrategy(x)
}

3. 重新打包并验证

  • 运行sbt assembly重新生成Jar包
  • 将Jar上传到S3,更新Glue作业的依赖配置
  • 启动Glue作业,检查是否解决了版本冲突和方法缺失问题

为什么这能解决问题?

  • 对齐Glue的Jackson版本,彻底避免版本冲突
  • 合并Jackson的模块服务文件,确保Scala Jackson模块能被Glue的Jackson正确加载
  • 不需要排除Jackson依赖,因为Glue已经提供了兼容版本,我们只是让第三方库使用这个版本

内容的提问来源于stack exchange,提问作者pwc

火山引擎 最新活动