问题描述
我有一个Spark 1.4.0项目,我正在尝试解析包含时间戳字段的几个JSON记录,并使用Jackson和将其存储在对象中。
如果我尝试从IDE运行驱动程序(即IntelliJ IDEA 14.0),它运行正常,但如果我使用和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库有关)。 有任何想法吗?
谢谢!
编辑: 重现问题的示例项目。
1楼
我有一个类似的问题,通过改变两件事来解决它:
1)我在对这个问题的评论中建议使用ObjectMapper
而不是ScalaObjectMapper
:
2)我需要在map操作中定义mapper。
val alertsData = sc.textFile(rawlines).map(alertStr => {
val mapper = new ObjectMapper()
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
mapper.registerModule(DefaultScalaModule)
broadcastVar.value.readValue(alertStr, classOf[Alert])
})
如果映射器在外部定义,我得到一个NullPointerException。 也试图播放它,它没有用。
此外,没有必要明确添加杰克逊作为依赖,因为火花提供它。
希望这可以帮助。
阿里扎
2楼
有一件事可能有助于升级到杰克逊2.5。
虽然Jackson Scala模块确实依赖于Guava到版本2.4,但这种依赖性已从2.5中删除( test
依赖于测试,但运行时没有任何内容)。
这至少会消除传递依赖冲突。