2016-06-16 17 views
6

Tôi là người mới bắt đầu của spark.I xây dựng một môi trường sử dụng "linux + idea + sbt", khi tôi thử khởi động nhanh Spark, tôi nhận được vấn đề:ý tưởng 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 

các phiên bản của chúng trong đĩa của tôi:

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

cấu trúc thư mục My:

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

trong build.propert ies:

sbt.version = 0.13.8 

Trong plugins.sbt:

logLevel := Level.Warn 

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

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

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

Trong assembly.sbt:

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

assemblySettings 

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

Làm cách nào để giải quyết vấn đề này.

Trả lời

7

Phụ thuộc có phạm vi "provided" chỉ khả dụng trong khi biên dịch và thử nghiệm và không có sẵn khi chạy hoặc để đóng gói. Vì vậy, thay vì tạo một đối tượng test với main, bạn nên đặt nó thành bộ thử nghiệm thực tế được đặt trong src/test/scala (Nếu bạn không quen thuộc với thử nghiệm đơn vị trong Scala, tôi khuyên bạn nên sử dụng ScalaTest, chẳng hạn. một sự phụ thuộc vào nó trong build.sbt của bạn: libraryDependencies += "org.scalatest" %% "scalatest" % "2.2.4" % Test và sau đó đi cho điều này quick start tutorial để thực hiện một spec đơn giản).


Một tùy chọn khác, đó là khá hacky, theo ý kiến ​​của tôi (nhưng hiện các trick dù sao), bao gồm việc loại bỏ provided phạm vi từ spark-core sự phụ thuộc của bạn trong một số cấu hình và được mô tả trong các câu trả lời được chấp nhận để this question.

+0

Tôi gặp sự cố này đối với lớp Scala 'src/main/scala/app/Main.scala'. Mọi thứ đều ổn, ứng dụng được thực hiện, nhưng tôi không thể khởi tạo 'ScparkConf()' bởi vì tôi cũng nhận được một 'NoClassDefFoundError'. Tôi đang theo [hướng dẫn này] (https://hortonworks.com/tutorial/setting-up-a-spark-development-environment-with-scala/) cũng sử dụng 'cung cấp' trong quản lý phụ thuộc. Những gì tôi không hoàn toàn hiểu là với tôi nó trông giống như nếu điều này sẽ làm việc như thế này. Vì vậy, tôi nên loại bỏ 'cung cấp' hoặc tôi có thể làm cho công việc này ngay cả với bộ cờ này? – displayname

3

Tôi gặp vấn đề tương tự sáng nay với lỗi được cung cấp. Tôi gỡ bỏ "cung cấp" và chạy sbt sạch, tải lại, biên dịch, gói, chạy. Tôi cũng kiểm tra bằng cách sử dụng tia lửa-gửi từ dòng lệnh. Nhưng tôi nghĩ rằng "cung cấp", thêm chi phí trên mã, jar là ít hơn.

Các vấn đề liên quan