2016-06-22 21 views
1

spark-coreNLP exampleを実行したいが、spark-submitを実行しているときにjava.lang.ClassNotFoundExceptionエラーが発生する。Scala - spark-corenlp - java.lang.ClassNotFoundException

ここに私がオブジェクトに入れたgithubの例のスカラコードがあり、SparkContextが定義されています。

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) 
    } 
} 

私は火花coreNLPが提供するbuild.sbtを使用しています - 私は私自身にscalaVersionとsparkVerisonを修正。

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" 
) 

次に、問題なく実行してjarファイルを作成しました。

sbt package 

は最後に、私はスパークする私の仕事を提出:

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

をしかし、私は次のエラーを取得する:

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) 

マイファイルSentiment.scalaがcorrecltyという名前のパッケージ内に位置しています」アナライザ"。

$ 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 

私はSpark Quick StartからSimpleApp例を実行したとき、私はMySimpleProject/binに/ SimpleApp.classが含まれていることに気づきました。 MySentimentProject/binは空です。だから私は自分のプロジェクトをきれいにしようとしました(私はScalaのEclipseを使用しています)。

私はSentiment.classを生成する必要があると思いますが、それを行う方法はわかりません - SimpleApp.scalaで自動的に実行され、Eclipse Scalaで実行/ビルドするときはクラッシュします。

+0

あなたのソースコードを作る私はSentiment.scalaの開始時に、 'パッケージ・アナライザを'表示されません。 Scalaでは、ファイル名とディレクトリをクラスやパッケージから切り離すことができるので、 "analyzer"という名前のディレクトリにいるだけでは不十分です。 –

+0

Sentiment.scalaの先頭に 'package analyzer'を追加しました。何の効果もありません。私はスカラのバージョンを2.11から2.10.6に変更して、spark-corenlpと同じ設定にしました。効果はありません。 –

答えて

1

たぶん、あなたはあなたのbuild.sbt

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

を追加しようとする必要があり、原因sbt documentは、「メインScalaのソースを含むディレクトリがデフォルトsrc/main/scalaである」と読みます。

それとも、この構造で

$ 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

それは働いた!ありがとうございました!今コンパイルすると、図書館のインポートの問題に対処しなければならないことがわかります) –

関連する問題