2015-03-02 18 views
3
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冲突的问题,我一直在使用 MVN版本重建星火:用最新版本 - Dincludes = org.codehaus.jackson:杰克逊核心 - 翔升 MVN版本:用最新版本-Dincludes = org.codehaus.jackson:杰克逊映射器 - 翔升星火运行错误java.lang.NoClassDefFoundError:组织/ Codehaus的/杰克逊/注释/ JsonClass

所以罐子已更新的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) 
+0

如果您使用spark-submit脚本,您是否使用'--jars'选项提供了jar的路径? – BenFradet 2015-03-03 18:09:43

+0

谢谢你的回复。我试过了。我也试过spark.files.userClassPathFirst选项。没有运气。 – Wendy 2015-03-04 20:07:29

回答

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 3的事情你的代码应工作:

  1. 升级到2.4.x的构建小于或等于2.4.4由于实际依存度将被替换火花是2.4.4(写这篇文章的时候)
  2. 降级到1.8.x,这个版本低于或等于1.8.x build,hadoop使用的是
  3. 编译spark在你的1.9.x版本下。我知道你提到这一点,但它没有工作,但当我们尝试它是成功的,我们使用选项运行构建-Dcodehaus.jackson.version = 1.9.2

将会有很多像这样的更多问题由于spark的特性以及它在classpath中已经拥有了它自己的所有内部依赖关系而不幸地发生,所以任何冲突的作业依赖都不会生效。 Spark已经做了一些依赖性着色来避免这种软件包像番石榴一样的问题,但目前这并不是用杰克逊来完成的。

相关问题