2015-03-02 62 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已經做了一些依賴性着色來避免這種軟件包像番石榴一樣的問題,但目前這並不是用傑克遜來完成的。