2016-06-22 16 views
1

Ich möchte spark-coreNLP example ausführen, aber ich bekomme eine java.lang.ClassNotFoundException Fehler beim Ausführen von Spark-submit.Scala - spark-corenlp - java.lang.ClassNotFoundException

Hier ist der Scala-Code aus dem Github-Beispiel, den ich in ein Objekt einfüge, und einen SparkContext definiert habe.

analyzer.Sentiment.scala:

package analyzer 
import org.apache.spark.SparkContext 
import org.apache.spark.SparkContext._ 
import org.apache.spark.SparkConf 
import org.apache.spark.sql.functions._ 
import com.databricks.spark.corenlp.functions._ 
import sqlContext.implicits._ 

object Sentiment { 
    def main(args: Array[String]) { 

    val conf = new SparkConf().setAppName("Sentiment") 
    val sc = new SparkContext(conf) 

     val input = Seq(
       (1, "<xml>Stanford University is located in California. It is a great university.</xml>") 
       ).toDF("id", "text") 

     val output = input 
      .select(cleanxml('text).as('doc)) 
      .select(explode(ssplit('doc)).as('sen)) 
      .select('sen, tokenize('sen).as('words), ner('sen).as('nerTags), sentiment('sen).as('sentiment)) 

      output.show(truncate = false) 
    } 
} 

ich die build.sbt durch Funken coreNLP vorgesehen bin mit - ich modifiziert nur die scalaVersion und sparkVerison zu meinem eigenen.

version := "1.0" 

scalaVersion := "2.11.8" 

initialize := { 
    val _ = initialize.value 
    val required = VersionNumber("1.8") 
    val current = VersionNumber(sys.props("java.specification.version")) 
    assert(VersionNumber.Strict.isCompatible(current, required), s"Java $required required.") 
} 

sparkVersion := "1.5.2" 

// change the value below to change the directory where your zip artifact will be created 
spDistDirectory := target.value 

sparkComponents += "mllib" 

spName := "databricks/spark-corenlp" 

licenses := Seq("GPL-3.0" -> url("http://opensource.org/licenses/GPL-3.0")) 

resolvers += Resolver.mavenLocal 

libraryDependencies ++= Seq(
    "edu.stanford.nlp" % "stanford-corenlp" % "3.6.0", 
    "edu.stanford.nlp" % "stanford-corenlp" % "3.6.0" classifier "models", 
    "com.google.protobuf" % "protobuf-java" % "2.6.1" 
) 

Dann habe ich mein Glas durch Laufen ohne Probleme erstellt.

sbt package 

Schließlich lege ich meinen Job Spark:

spark-submit --class "analyzer.Sentiment" --master local[4] target/scala-2.11/sentimentanalizer_2.11-0.1-SNAPSHOT.jar 

Aber ich erhalte den folgenden Fehler:

java.lang.ClassNotFoundException: analyzer.Sentiment 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
    at java.lang.Class.forName0(Native Method) 
    at java.lang.Class.forName(Class.java:348) 
    at org.apache.spark.util.Utils$.classForName(Utils.scala:173) 
    at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:641) 
    at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:180) 
    at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:205) 
    at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:120) 
    at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala) 

Meine Datei Sentiment.scala ist Correclty in einem Paket befindet namens " Analysator ".

$ find . 
    ./src 
    ./src/analyzer 
    ./src/analyzer/Sentiment.scala 
    ./src/com 
    ./src/com/databricks 
    ./src/com/databricks/spark 
    ./src/com/databricks/spark/corenlp 
    ./src/com/databricks/spark/corenlp/CoreNLP.scala 
    ./src/com/databricks/spark/corenlp/functions.scala 
    ./src/com/databricks/spark/corenlp/StanfordCoreNLPWrapper.scala 

Als ich das SimpleApp Beispiel aus dem Spark Quick Start lief, bemerkte ich, dass MySimpleProject/bin/eine SimpleApp.class enthalten. MySentimentProject/bin ist leer. Also habe ich versucht, mein Projekt zu säubern (ich benutze Eclipse für Scala).

Ich denke, es ist, weil ich Sentiment.class generieren muss, aber ich weiß nicht, wie es geht - es wurde automatisch mit SimpleApp.scala getan, und wenn es mit Eclipse Scala laufen/bauen, es stürzt ab.

+0

Ich sehe nicht, 'Paket Analysator' zu Beginn des Sentiment.scala. Es ist nicht genug, in einem Verzeichnis namens "Analyzer" zu sein, da Scala Ihnen erlaubt, Dateinamen und Verzeichnisse von Klassen und Paketen zu entkoppeln. –

+0

Ich habe 'Paket-Analysator' am Anfang von Sentiment.scala hinzugefügt. ohne Wirkung. Ich änderte auch meine Version von Scala von 2.11 zu 2.10.6, um dieselbe Konfiguration als Funken-corenlp zu haben, ohne Effekt. –

Antwort

1

Vielleicht sollten Sie versuchen,

scalaSource in Compile := baseDirectory.value/"src" 

zu Ihrem build.sbt hinzuzufügen, zu verursachen sbt document liest, dass „das Verzeichnis, das die Haupt Scala Quellen enthält standardmäßig src/main/scala“.

Oder einfach nur den Quellcode in dieser Struktur machen

$ find . 
./src 
./src/main 
./src/main/scala 
./src/main/scala/analyzer 
./src/main/scala/analyzer/Sentiment.scala 
./src/main/scala/com 
./src/main/scala/com/databricks 
./src/main/scala/com/databricks/spark 
./src/main/scala/com/databricks/spark/corenlp 
./src/main/scala/com/databricks/spark/corenlp/CoreNLP.scala 
./src/main/scala/com/databricks/spark/corenlp/functions.scala 
./src/main/scala/com/databricks/spark/corenlp/StanfordCoreNLPWrapper.scala 
+0

Es hat funktioniert! Vielen Dank! Jetzt, da es kompiliert, kann ich sehen, dass ich mit Bibliotheksimportproblemen umgehen muss;) –

Verwandte Themen