2016-06-22 4 views
1

spark-coreNLP example을 실행하고 싶지만 spark-submit을 실행할 때 java.lang.ClassNotFoundException 오류가 발생합니다.스칼라 - 스파크 - corenlp - java.lang.ClassNotFoundException

여기에 github 예제의 스칼라 코드가 있습니다.이 코드는 객체에 넣고 SparkContext를 정의했습니다.

는 analyzer.Sentiment.scala :

나는 스파크 coreNLP에서 제공하는 build.sbt을 사용하고
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) 
    } 
} 

는 - 나는 단지 내 자신에 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라는 이름의 패키지에 있습니다 " 분석기 ". 나는 Spark Quick Start에서 SimpleApp 예제를 실행하면

$ 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 

, 나는 MySimpleProject이/빈/A SimpleApp.class 포함 된 것으로 나타났습니다. MySentimentProject/bin이 비어 있습니다. 그래서 나는 프로젝트를 청소하려고했다. (나는 Scala 용 Eclipse를 사용하고있다.)

Sentiment.class를 생성해야하기 때문에 생각합니다. 어떻게해야할지 모르겠습니다. SimpleApp.scala를 사용하여 자동으로 수행되었으며, Eclipse Scala로 실행/빌드 할 때 충돌.

+0

에 소스 코드를 확인하십시오. 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는 "주요 스칼라 소스가 들어있는 디렉토리는 기본적 src/main/scala입니다"고 읽고 원인 시도해야합니다.

아니면 그냥 내가 Sentiment.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

효과가있었습니다! 고맙습니다! 이제 컴파일되어 라이브러리 가져 오기 문제를 처리해야한다는 것을 알 수 있습니다.) –