2016-06-16 12 views
6

Jestem początkującym iskra. Buduję wykorzystanie środowiska "linux + idea + sbt", kiedy próbuję szybki start Sparka, dostaję problem:pomysł 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 

wersje z nich w moim dysku:

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

Moja struktura katalogów:

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

W build.propert y:

sbt.version = 0.13.8 

W plugins.sbt:

logLevel := Level.Warn 

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

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

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

W assembly.sbt:

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

assemblySettings 

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

Jak mogę rozwiązać ten problem.

Odpowiedz

7

Zależności z zakresem "provided" są dostępne tylko podczas kompilacji i testowania i nie są dostępne w czasie wykonywania ani podczas pakowania. Tak więc, zamiast tworzyć obiekt test z main, powinieneś uczynić go rzeczywistym zestawem testowym umieszczonym w src/test/scala (Jeśli nie jesteś zaznajomiony z testowaniem jednostkowym w Scali, sugerowałbym na przykład użycie ScalaTest. zależność od niego w pliku build.sbt: libraryDependencies += "org.scalatest" %% "scalatest" % "2.2.4" % Test, a następnie przejdź do tego quick start tutorial, aby zaimplementować prostą specyfikację).


Inną opcją, która jest dość hacky, moim zdaniem (ale mimo to załatwia sprawę), polega na usunięciu provided zakresu od uzależnienia spark-core w niektórych konfiguracjach i jest opisane w przyjętym odpowiedzi this question.

+0

Mam ten problem dla klasy Scala 'src/main/scala/app/Main.scala'. Wszystko wygląda dobrze, aplikacja zostaje wykonana, ale nie mogę utworzyć instancji 'ScparkConf()', ponieważ otrzymuję także 'NoClassDefFoundError'. Obserwuję [ten samouczek] (https://hortonworks.com/tutorial/setting-up-a-spark-development-environment-with-scala/), który również używa 'provided' w zarządzaniu zależnościami. Nie do końca rozumiem, że dla mnie wygląda to tak, jakby to działało w ten sposób. Czy powinienem usunąć "dostarczony" lub czy mogę wykonać tę operację nawet z tą ustawioną flagą? – displayname

3

Miałem ten sam problem dziś rano z podanym błędem. Usunąłem "dostarczone" i uruchomiłem sbt clean, przeładowałem, skompilowałem, spakowałem, uruchomiłem. Testuję również za pomocą polecenia spark-submit z linii poleceń. Ale myślę, że "dostarczone", dodatkowy koszt na kod, jar jest mniejszy.

Powiązane problemy