2015-05-02 3 views
7

Sto tentando di eseguire spark-submit con Spark 1.1.0 e Jackson 2.4.4. Ho un codice scala che usa Jackson per de-serializzare JSON nelle classi case. Che funziona bene da solo, ma quando lo uso con scintilla ottengo il seguente errore:java.lang.NoSuchMethodError Jackson database e Spark

15/05/01 17:50:11 ERROR Executor: Exception in task 0.0 in stage 1.0 (TID 2) 
java.lang.NoSuchMethodError: com.fasterxml.jackson.databind.introspect.POJOPropertyBuilder.addField(Lcom/fasterxml/jackson/databind/introspect/AnnotatedField;Lcom/fasterxml/jackson/databind/PropertyName;ZZZ)V 
    at com.fasterxml.jackson.module.scala.introspect.ScalaPropertiesCollector.com$fasterxml$jackson$module$scala$introspect$ScalaPropertiesCollector$$_addField(ScalaPropertiesCollector.scala:109) 
    at com.fasterxml.jackson.module.scala.introspect.ScalaPropertiesCollector$$anonfun$_addFields$2$$anonfun$apply$11.apply(ScalaPropertiesCollector.scala:100) 
    at com.fasterxml.jackson.module.scala.introspect.ScalaPropertiesCollector$$anonfun$_addFields$2$$anonfun$apply$11.apply(ScalaPropertiesCollector.scala:99) 
    at scala.Option.foreach(Option.scala:236) 
    at com.fasterxml.jackson.module.scala.introspect.ScalaPropertiesCollector$$anonfun$_addFields$2.apply(ScalaPropertiesCollector.scala:99) 
    at com.fasterxml.jackson.module.scala.introspect.ScalaPropertiesCollector$$anonfun$_addFields$2.apply(ScalaPropertiesCollector.scala:93) 
    at scala.collection.GenTraversableViewLike$Filtered$$anonfun$foreach$4.apply(GenTraversableViewLike.scala:109) 
    at scala.collection.Iterator$class.foreach(Iterator.scala:727) 
    at scala.collection.AbstractIterator.foreach(Iterator.scala:1157) 
    at scala.collection.IterableLike$class.foreach(IterableLike.scala:72) 
    at scala.collection.SeqLike$$anon$2.foreach(SeqLike.scala:635) 
    at scala.collection.GenTraversableViewLike$Filtered$class.foreach(GenTraversableViewLike.scala:108) 
    at scala.collection.SeqViewLike$$anon$5.foreach(SeqViewLike.scala:80) 
    at com.fasterxml.jackson.module.scala.introspect.ScalaPropertiesCollector._addFields(ScalaPropertiesCollector.scala:93) 

Ecco il mio build.sbt:

//scalaVersion in ThisBuild := "2.11.4" 
scalaVersion in ThisBuild := "2.10.5" 

retrieveManaged := true 

libraryDependencies += "org.scala-lang" % "scala-reflect" % scalaVersion.value 

libraryDependencies ++= Seq(
    "junit" % "junit" % "4.12" % "test", 
    "org.scalatest" %% "scalatest" % "2.2.4" % "test", 
    "org.mockito" % "mockito-core" % "1.9.5", 
    "org.specs2" %% "specs2" % "2.1.1" % "test", 
    "org.scalatest" %% "scalatest" % "2.2.4" % "test" 
) 

libraryDependencies ++= Seq(
    "org.apache.hadoop" % "hadoop-core" % "0.20.2", 
    "org.apache.hbase" % "hbase" % "0.94.6" 
) 

//libraryDependencies += "org.apache.spark" % "spark-core_2.10" % "1.3.0" 
libraryDependencies += "org.apache.spark" % "spark-core_2.10" % "1.1.0" 


libraryDependencies += "com.fasterxml.jackson.module" %% "jackson-module-scala" % "2.4.4" 
//libraryDependencies += "com.fasterxml.jackson.module" %% "jackson-module-scala" % "2.3.1" 
//libraryDependencies += "com.fasterxml.jackson.module" %% "jackson-module-scala" % "2.5.0" 

libraryDependencies += "com.typesafe" % "config" % "1.2.1" 

resolvers += Resolver.mavenLocal 

Come potete vedere, ho provato molte versioni differenti di Jackson.

Ecco lo script di shell che uso per eseguire scintilla di conferma:

#!/bin/bash 
sbt package 

CLASS=com.org.test.spark.test.SparkTest 

SPARKDIR=/Users/user/Desktop/ 
#SPARKVERSION=1.3.0 
SPARKVERSION=1.1.0 
SPARK="$SPARKDIR/spark-$SPARKVERSION/bin/spark-submit" 

jar_jackson=/Users/user/scala_projects/lib_managed/bundles/com.fasterxml.jackson.module/jackson-module-scala_2.10/jackson-module-scala_2.10-2.4.4.jar 

"$SPARK" \ 
    --class "$CLASS" \ 
    --jars $jar_jackson \ 
    --master local[4] \ 
    /Users/user/scala_projects/target/scala-2.10/spark_project_2.10-0.1-SNAPSHOT.jar \ 
    print /Users/user/test.json 

Io uso --jars al percorso del vaso Jackson al comando scintilla presentare. Ho anche provato diverse versioni di Spark. Ho anche specificato i percorsi per il database di Jackson, le annotazioni, ecc. Ma questo non risolve il problema. Qualsiasi aiuto sarebbe apprezzato. Grazie

+1

assomiglia di avere la versione in conflitto – Jens

+0

Anche se a specificare tutti i percorsi dei 2.4.4 Jackson vasi, ancora non funziona. Credo che la scintilla arrivi già con le sue librerie di Jackson 2.4.4 tranne che per il modulo scala, motivo per cui attualmente lo passo solo a --jars – user1077071

+0

@Jens puoi elaborare con quale? e come posso risolvere quelli? – user1077071

risposta

0

Il motivo principale per cui penso è che non si specifica la giusta dipendenza.

Se si utilizza la libreria di terze parti e quindi submit to Spark direttamente, il modo migliore è utilizzare sbt-assembly (https://github.com/sbt/sbt-assembly).

+0

grazie per il tuo commento. Ho provato a usare l'assembly sbt, ma ho ancora la stessa eccezione – user1077071

5

Ho avuto lo stesso problema in cui il mio barattolo di suoneria utilizzava jackson 2.3.2 e spark usava jackson 2.4.4.
Mentre eseguivo l'applicazione spark, non è stato possibile trovare il metodo in jackson-2.3.2 e ho ottenuto la stessa eccezione.

Ho controllato la gerarchia delle dipendenze di tipo Maven per Jackson. Ha mostrato la versione che ha preso e quale jar (Qui gioca usato 2.3.2) e come il mio play-json inserito all'inizio nella lista delle dipendenze, ci sono voluti 2.3.2 versione.

Così ho provato a mettere la dipendenza di gioco alla fine di tutte le dipendenze/dopo la dipendenza da scintilla e ha funzionato abbastanza bene. Ci sono voluti 2.4.4 questa volta e la versione 2.3.2 è stata omessa.

Source:

Note that if two dependency versions are at the same depth in the dependency tree, until Maven 2.0.8 it was not defined which one would win, but since Maven 2.0.9 it's the order in the declaration that counts: the first declaration wins.

1

Ho appena incontrato lo stesso problema con Jackson e scintilla. Mentre stavo usando SBT, come user1077071, ho seguito le seguenti fasi:

  1. installato l'eccellente dipendenze Plugin per SBT: https://github.com/jrudolph/sbt-dependency-graph
  2. scoperto che nel mio caso, play-JSON dipendeva da Jackson 2.3
  3. aggiunto jackson 2.4. alla mia bibliotecaDipendenze

Ho dovuto approcciare questo approccio alle libbre di jackson mulatiple: core, annotazioni e database. il colpevole era il colpevole, ma anche gli altri dovrebbero essere urtati per evitare scontri.

Dopo questo, ha funzionato come un fascino.

0

ottenuto java.lang.NoSuchMethodError Jackson DataBind per il metodo ...introspect.AnnotatedMember.annotations() Problema risolto aggiornando esperto di dipendenza per jackson-databind versione 2.9.0.pr3 - a 2.9.1

0

ho avuto

java.lang.NoSuchMethodError: com.fasterxml.jackson.core.JsonStreamContext.<init>(Lcom/fasterxml/jackson/core/JsonStreamContext;)V 

errore dopo l'aggiornamento librerie com.fasterxml.jackson.core da 2.8.9 a 2.9.1

nel mio caso, la risoluzione è di esaminare le dipendenze gradle e in build.gradle exclude tutti i conflitti:

compile('org.springframework.boot:spring-boot-starter-web:1.5.7.RELEASE') { 
    exclude group: "com.fasterxml.jackson.core" 
} 

compile('org.springframework.boot:spring-boot-starter-jdbc:1.5.7.RELEASE') { 
    exclude group: "com.fasterxml.jackson.core" 
} 

compile('com.fasterxml.jackson.core:jackson-databind:2.9.1') { 
    exclude module: "jackson-annotations" 
    exclude module: "jackson-core" 
} 

compile('com.fasterxml.jackson.core:jackson-annotations:2.9.1') 

compile('com.fasterxml.jackson.core:jackson-core:2.9.1') 

compile 'org.scala-lang:scala-library:2.12.3' 

compile('com.fasterxml.jackson.module:jackson-module-scala_2.12:2.9.1') { 
    exclude group: "org.scala-lang" 
    exclude module: "jackson-core" 
    exclude module: "jackson-annotations" 
    exclude module: "jackson-databind" 
}