【问题标题】:Spark running error java.lang.NoClassDefFoundError: org/codehaus/jackson/annotate/JsonClassSpark运行错误java.lang.NoClassDefFoundError:org/codehaus/jackson/annotate/JsonClass
【发布时间】:2015-05-02 14:27:03
【问题描述】:
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 冲突问题,我已经使用 mvn 版本:使用最新版本 -Dincludes=org.codehaus.jackson:jackson-core-asl mvn 版本:使用最新版本 -Dincludes=org.codehaus.jackson:jackson-mapper-asl

所以 jar 已经更新到 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)

【问题讨论】:

  • 如果您使用的是 spark-submit 脚本,您是否使用 --jars 选项提供了 jar 的路径?
  • 感谢您的回复。我试过了。而且我还尝试了 spark.files.userClassPathFirst 选项。没有运气。

标签: json playframework jackson apache-spark


【解决方案1】:

我们遇到了几乎完全相同的问题。我们尝试使用 1.9.2,但也遇到了 no such method 错误。

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

所以在你的情况下,如果你做了 3 件事中的 1 件事,你的代码应该可以工作:

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

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

【讨论】:

    猜你喜欢
    • 2014-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-06
    • 2013-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多