Spark运行错误java.lang.NoClassDefFoundError:org / codehaus / jackson / annotate / JsonClass

时间:2015-03-02 09:28:51

标签: json playframework jackson apache-spark

import org.apache.spark.SparkContext._
import org.apache.spark.SparkConf
import play.api.libs.json._
import java.util.Date
import javax.xml.bind.DatatypeConverter
object Test {
def main(args:Array[String]): Unit = {
    val logFile="test.txt"
    val conf=new SparkConf().setAppName("Json Test")
    val sc = new SparkContext(conf)
    try {
        val out= "output/test"
        val logData=sc.textFile(logFile,2).map(line => Json.parse(cleanTypo(line))).cache()

    } finally { 
        sc.stop()
    }
}

由于有关Spark jackson冲突问题的说法,我已经重建了Spark使用      mvn版本:use-latest-versions -Dincludes = org.codehaus.jackson:jackson-core-asl      mvn版本:use-latest-versions -Dincludes = org.codehaus.jackson:jackson-mapper-asl

所以罐子已经更新到1.9.x. 但我仍然有错误

15/03/02 03:12:19 ERROR Executor: Exception in task 0.0 in stage 0.0 (TID 0)
java.lang.NoClassDefFoundError: org/codehaus/jackson/annotate/JsonClass
at      org.codehaus.jackson.map.introspect.JacksonAnnotationIntrospector.findDeserializationType(JacksonAnnotationIntrospector.java:524)
at org.codehaus.jackson.map.deser.BasicDeserializerFactory.modifyTypeByAnnotation(BasicDeserializerFactory.java:732)
at org.codehaus.jackson.map.deser.BeanDeserializerFactory.createBeanDeserializer(BeanDeserializerFactory.java:427)
at org.codehaus.jackson.map.deser.StdDeserializerProvider._createDeserializer(StdDeserializerProvider.java:398)
at org.codehaus.jackson.map.deser.StdDeserializerProvider._createAndCache2(StdDeserializerProvider.java:307)
at org.codehaus.jackson.map.deser.StdDeserializerProvider._createAndCacheValueDeserializer(StdDeserializerProvider.java:287)
at org.codehaus.jackson.map.deser.StdDeserializerProvider.findValueDeserializer(StdDeserializerProvider.java:136)
at    org.codehaus.jackson.map.deser.StdDeserializerProvider.findTypedValueDeserializer(StdDeserializerProvider.java:157)
at     org.codehaus.jackson.map.ObjectMapper._findRootDeserializer(ObjectMapper.java:2468)
at org.codehaus.jackson.map.ObjectMapper._readValue(ObjectMapper.java:2383)
at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1094)
at play.api.libs.json.JacksonJson$.parseJsValue(JsValue.scala:477)
at play.api.libs.json.Json$.parse(Json.scala:16)

1 个答案:

答案 0 :(得分:5)

我们几乎遇到了同样的问题。我们试图使用1.9.2,但也没有遇到这样的方法错误。

令人讨厌的是,不仅有1个版本冲突要处理,而且2.首先,Spark依赖于Hadoop(对于hdfs),它依赖于jackson json的1.8.x版本,这就是你所看到的冲突。 Spark(至少1.2+)然后使用jackson 2.4.4核心,它实际上已移动到com.fasterxml.jackson.core,因此由于包名称不同,它实际上与1.8.x不冲突。

因此,在您的情况下,如果您执行以下三项操作中的一项,则您的代码应该有效:

  1. 升级到2.4.x版本,该版本低于或等于2.4.4,因为实际的依赖关系将被火花替换为2.4.4(在撰写本文时)
  2. 降级到1.8.x,该版本低于或等于hadoop正在使用的1.8.x版本
  3. 在1.9.x版本下编译spark。我知道你提到这个并且它没有用,但是当我们尝试它时它成功了,我们使用选项-Dcodehaus.jackson.version = 1.9.2
  4. 运行构建。

    不幸的是,由于spark的性质以及它如何已经在类路径上拥有所有自己的内部依赖性,所以会出现更多这样的问题,因此任何冲突的作业依赖都将无法解决。 Spark已经做了一些依赖关系着色以避免像guava这样的软件包这个问题,但目前还没有杰克逊这样做。