2016-06-16 3 views
6

저는 Spark의 초보자입니다. "Linux + idea + sbt"를 사용하여 환경을 구축합니다. 문제 : 내 디스크 그들의아이디어 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 

버전 :

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

내 디렉토리 구조 :

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

build.propert에서 IES :

sbt.version = 0.13.8 
plugins.sbt에서

:

logLevel := Level.Warn 

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

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

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" 

assembly.sbt 물 : test.scala에서

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

assemblySettings 

:

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

이 문제를 어떻게 해결할 수 있습니까?

답변

7

범위는 "provided" 범위이며 컴파일 및 테스트 중에 만 사용할 수 있으며 런타임 또는 패키징 할 때 사용할 수 없습니다. 따라서 testmain으로 만드는 대신 src/test/scala에 배치 된 실제 테스트 스위트로 만들어야합니다. (스칼라의 단위 테스트에 익숙하지 않은 경우 ScalaTest를 사용하는 것이 좋습니다.) 먼저 추가하십시오. build.sbt : libraryDependencies += "org.scalatest" %% "scalatest" % "2.2.4" % Test에서 종속성을 확인한 다음이 quick start tutorial에 간단한 사양을 구현하십시오.)


내 의견으로는, 매우 해키 (그럼에도 불구하고 트릭 않습니다) 또 다른 옵션은, 일부 구성에 spark-core 의존성에서 provided 범위를 제거하는 것을 포함하고 this question에 허용 대답에 설명되어 있습니다.

+0

이 문제는 Scala 클래스'src/main/scala/app/Main.scala'에서 발생합니다. 모든게 괜찮아 보이지만 응용 프로그램이 실행되지만'NoClassDefFoundError'를 받기 때문에'ScparkConf()'를 인스턴스화 할 수 없습니다. 나는이 자습서 (https://hortonworks.com/tutorial/setting-up-a-spark-development-environment-with-scala/)를 따르고 있는데 의존성 관리에서도''제공된 '을 사용합니다. 내가 이해하지 못하는 것은 나에게 이것이 마치 이렇게 작동해야하는 것처럼 보입니다. 그래서'제공된 '을 제거해야합니까, 아니면이 플래그를 설정하더라도이 작업을 할 수 있습니까? – displayname

3

제공된 오류와 함께 오늘 아침에 같은 문제가있었습니다. 나는 "제공된"을 제거하고 sbt를 실행하고, 다시로드하고, 컴파일하고, 패키지를 실행합니다. 또한 커맨드 라인에서 spark-submit을 사용하여 테스트합니다. 그러나 나는 코드에서 여분의 오버 헤드 인 "제공"이 있다고 생각합니다.