scala - 如何将 Jackson 依赖项与 AWS Glue 结合使用
问题描述
我尝试在 AWS Glue 作业中使用https://github.com/snowplow/scala-maxmind-iplookups库。我使用https://github.com/sbt/sbt-assembly创建包含所有依赖项的 jar。
在包含杰克逊的情况下
dependencyOverrides ++= Seq(
"com.fasterxml.jackson.core" % "jackson-core" % "2.9.3",
"com.fasterxml.jackson.core" % "jackson-databind" % "2.9.3",
"com.fasterxml.jackson.core" % "jackson-annotations" % "2.9.3",
)
错误是
Caused by: com.fasterxml.jackson.databind.JsonMappingException: Incompatible Jackson version: 2.9.3
完整日志https://gist.github.com/pawaclawczyk/81844b5063d998acd3528f136c7a01f5
排除杰克逊的情况下
excludeDependencies ++= Seq(
ExclusionRule("com.fasterxml.jackson.core")
)
错误是
ERROR ApplicationMaster: User class threw exception: java.lang.NoSuchMethodError: com.fasterxml.jackson.databind.node.ArrayNode.<init>(Lcom/fasterxml/jackson/databind/node/JsonNodeFactory;Ljava/util/List;)V
java.lang.NoSuchMethodError: com.fasterxml.jackson.databind.node.ArrayNode.<init>(Lcom/fasterxml/jackson/databind/node/JsonNodeFactory;Ljava/util/List;)V
完整日志https://gist.github.com/pawaclawczyk/825d66e2148d688e274eb36c99c18a89
解决方案
AWS Glue 带来了 Jackson 依赖项,但我不确定是哪个版本。你可以检查glue-assembly.jar 的内容——这里是如何获取它的。
问题是您的程序集和粘合程序集最终都在 Spark 执行器上的相同类路径上。
在使用 Google Big Query Connector(主要是 jackson 和 guava)时,我的项目中的库不兼容也遇到了同样的问题,我通过在我的程序集 jar 中对这些库进行着色来解决它,如下所示:
lazy val root = (project in file(".")).
settings(
...,
assemblyShadeRules in assembly := Seq(
ShadeRule.rename("com.fasterxml.**" -> "my.shaded.@0").inAll,
// other shade rules
),
libraryDependencies ++= ...
)
推荐阅读
- amazon-web-services - 如何在 Cloudwatch 中为 RDS 内存利用率创建自定义指标?
- arduino - 'const' 之前的预期主表达式
- three.js - 如何在 ThreeJS 控件中偏移目标位置
- c - 没有重载函数的实例与参数列表匹配
- sql - SQL:连接两个表时获得“滚动”平均值
- vhdl - 仅在 Modelsim 上出现未知标识符错误?
- uwp - 构建 Ionic 4 Cordova 通用 Windows 应用程序显示白屏
- javascript - 使用 Flask 时 Javascript 请求导致未定义
- django-models - 使用 Django 1.11 自定义登录页面
- c++ - 从线程接收结果