2016-06-16 13 views
6

Ich bin ein Anfänger von spark.Ich baue eine Umgebung verwenden "linux + idea + sbt", wenn ich den schnellen Start von Spark versuche, bekomme ich das Problem:Idee sbt java.lang.NoClassDefFoundError: org/apache/spark/SparkConf

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/spark/SparkConf 
    at test$.main(test.scala:11) 
    at test.main(test.scala) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144) 
Caused by: java.lang.ClassNotFoundException: org.apache.spark.SparkConf 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
    ... 7 more 

die Versionen von ihnen in meiner Festplatte:

sbt = 0.13.11 
jdk = 1.8 
scala = 2.10 
idea = 2016 

Meine Verzeichnisstruktur:

test/ 
    idea/ 
    out/ 
    project/ 
    build.properties  
    plugins.sbt 
    src/ 
    main/ 
     java/ 
     resources/ 
     scala/ 
     scala-2.10/ 
     test.scala 
    target/ 
    assembly.sbt 
    build.sbt 

in build.propert ies:

sbt.version = 0.13.8 

In plugins.sbt:

logLevel := Level.Warn 

addSbtPlugin("com.github.mpeltonen" % "sbt-idea" % "1.6.0") 

addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.11.2") 

In build.sbt:

import sbt._ 
import Keys._ 
import sbtassembly.Plugin._ 
import AssemblyKeys._ 

name := "test" 

version := "1.0" 

scalaVersion := "2.10.4" 

libraryDependencies += "org.apache.spark" % "spark-core_2.10" % "1.6.1" % "provided" 

In assembly.sbt:

import AssemblyKeys._ // put this at the top of the file 

assemblySettings 

In test.scala:

import org.apache.spark.SparkContext 
import org.apache.spark.SparkContext._ 
import org.apache.spark.SparkConf 

object test { 
    def main(args: Array[String]) { 
    val logFile = "/opt/spark-1.6.1-bin-hadoop2.6/README.md" // Should be some file on your system 
    val conf = new SparkConf().setAppName("Test Application") 
    val sc = new SparkContext(conf) 
    val logData = sc.textFile(logFile, 2).cache() 
    val numAs = logData.filter(line => line.contains("a")).count() 
    val numBs = logData.filter(line => line.contains("b")).count() 
    println("Lines with a: %s, Lines with b: %s".format(numAs, numBs)) 
    } 
} 

Wie kann ich dieses Problem lösen?

Antwort

7

Abhängigkeiten mit dem Bereich "provided" sind nur beim Kompilieren und Testen verfügbar und nicht zur Laufzeit oder zum Verpacken verfügbar. Anstatt also ein Objekt test mit einem main zu erstellen, sollten Sie es zu einer echten Testsuite machen, die in src/test/scala platziert ist (Wenn Sie mit Unit-Testing in Scala nicht vertraut sind, würde ich zum Beispiel ScalaTest empfehlen. Zuerst hinzufügen eine Abhängigkeit davon in Ihrem build.sbt: libraryDependencies += "org.scalatest" %% "scalatest" % "2.2.4" % Test und gehen Sie dann für diese quick start tutorial, um eine einfache Spezifikation zu implementieren).


Eine weitere Option, die ziemlich hacky ist, meiner Meinung nach (aber funktioniert der Trick dennoch) beinhaltet provided Umfang von Ihrem spark-core Abhängigkeit in einigen Konfigurationen zu entfernen und wird in der akzeptierte Antwort auf this question beschrieben.

+0

Ich habe dieses Problem für eine Scala-Klasse "src/main/scala/app/Main.scala". Alles sieht gut aus, die Anwendung wird ausgeführt, aber ich kann 'ScparkConf()' nicht instanziieren, weil ich auch einen 'NoClassDefFoundError' bekomme. Ich folge [diesem Tutorial] (https://hortonworks.com/tutorial/setting-up-a-spark-development-environment-with-scala/), das auch 'depended' in der Abhängigkeitsverwaltung verwendet. Was ich nicht ganz verstehe ist, dass es für mich so aussieht, als ob das so funktionieren sollte. Also sollte ich "zur Verfügung gestellt" entfernen oder kann ich das auch mit dieser Flagge machen? – displayname

3

Ich hatte das gleiche Problem heute Morgen mit dem Fehler zur Verfügung gestellt. Ich habe "bereitgestellt" entfernt und sbt sauber, neu laden, kompilieren, packen, laufen lassen. Ich teste auch mit Funken Submit von der Kommandozeile. Aber ich denke "bereitgestellt", der zusätzliche Aufwand für Code, Glas ist weniger.