【发布时间】:2015-07-16 11:23:52
【问题描述】:
我有一个 Spark 1.4.0 项目,我正在尝试使用 Jackson 和 JSR-310 module 解析多个包含时间戳字段的 JSON 记录并将其存储在 ZonedDateTime 对象中。如果我尝试从 IDE(即 IntelliJ IDEA 14.0)运行驱动程序,它会正常运行,但如果我使用 sbt assembly 和 spark-submit,则会出现以下异常:
15/07/16 14:13:03 ERROR Executor: Exception in task 3.0 in stage 0.0 (TID 3)
java.lang.AbstractMethodError: com.mycompany.input.EventParser$$anonfun$1$$anon$1.com$fasterxml$jackson$module$scala$experimental$ScalaObjectMapper$_setter_$com$fasterxml$jackson$module$scala$experimental$ScalaObjectMapper$$typeCache_$eq(Lorg/spark-project/guava/cache/LoadingCache;)V
at com.fasterxml.jackson.module.scala.experimental.ScalaObjectMapper$class.$init$(ScalaObjectMapper.scala:50)
at com.mycompany.input.EventParser$$anonfun$1$$anon$1.<init>(EventParser.scala:27)
at com.mycompany.input.EventParser$$anonfun$1.apply(EventParser.scala:27)
at com.mycompany.input.EventParser$$anonfun$1.apply(EventParser.scala:24)
at org.apache.spark.rdd.RDD$$anonfun$mapPartitions$1$$anonfun$apply$17.apply(RDD.scala:686)
at org.apache.spark.rdd.RDD$$anonfun$mapPartitions$1$$anonfun$apply$17.apply(RDD.scala:686)
at org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:35)
at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:277)
at org.apache.spark.CacheManager.getOrCompute(CacheManager.scala:69)
at org.apache.spark.rdd.RDD.iterator(RDD.scala:242)
at org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:35)
at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:277)
at org.apache.spark.rdd.RDD.iterator(RDD.scala:244)
at org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:35)
at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:277)
at org.apache.spark.rdd.RDD.iterator(RDD.scala:244)
at org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:70)
at org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:41)
at org.apache.spark.scheduler.Task.run(Task.scala:70)
at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:213)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
我尝试了几个版本的汇编、杰克逊和火花,但没有运气。我想这在某种程度上与 spark 和我的项目(不知何故,使用 Guava 库)之间的依赖冲突有关。有什么想法吗?
谢谢!
编辑:重现问题here的示例项目。
【问题讨论】:
-
检查 spark 自己的 lib 目录中所有 jar 的版本(例如 jackson)。然后确保您针对这些完全相同的版本进行构建。
-
@Imm 似乎 Spark 1.4.0 使用的是 Jackson 2.4.4,这与我在项目中使用的版本相同。尽管如此,还是没有运气。同样的问题仍然存在。
-
你使用的是同一个版本的scala,对吧?
-
@Imm 是的,我尝试使用相同版本的 Scala (2.10.4)。此外,我自己使用 Scala 2.11 编译了 Spark,我还制作了一个等效的 Maven 项目来尝试遮蔽有问题的库。但仍然没有运气:(
-
不幸的是,很明显,系统的某些部分在使用与编译使用不同的 Guava 版本时遇到问题。我的另一个建议是尝试升级到 Jackson 2.5(见答案);这将消除 Guava 依赖项之一,因为 Scala 模块的 2.5 不再依赖 Guava。
标签: java scala apache-spark jackson