我尝试使用apache spark
和scala sbt
一起开发独立应用
我一次又一次地收到这个错误。
线程中的异常" main" java.lang.NoClassDefFoundError:org / apache / spark / SparkConf 在AuctionsApp $ .main(AuctionsApp.scala:5)
以下是代码段。
import org.apache.spark.SparkConf
object AuctionsApp {
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setAppName("AuctionsApp")
println(conf)
}
}
build.sbt
档案
name := "AuctionsApp"
version := "1.0"
scalaVersion := "2.10.5"
libraryDependencies += "org.apache.spark" % "spark-core_2.10" % "1.2.0-cdh5.3.2" % "provided"
resolvers += "Cloudera Repository" at "https://repository.cloudera.com/artifactory/cloudera-repos/"
我可以通过按下命令导航到SparkConf
文件并单击import
语句中的类名,意味着它与其他代码一起驻留在那里。
项目构建也很成功。
感谢任何帮助。
PS。使用IntelliJ Idea CE
版本2016.3
答案 0 :(得分:2)
请注意,在SBT中,您指定provided
,这意味着在应用程序启动时,假定包含该类的JAR存在于类路径中,这在本地调试时并非如此。
为了解决这个问题,我们创建了一个额外的项目,仅用于本地调试Spark。首先,我们在项目定义之外声明Spark的依赖项:
lazy val sparkDeps = Seq(
"org.apache.spark" %% "spark-core" % "1.2.0-cdh5.3.2"
)
然后我们创建新项目,该项目依赖于我们的主项目和map
而不是Sparks依赖项,并将compile
注释添加到模块中:
lazy val sparkProject =
project in file("spark-project")
.settings(
// Add your settings and such
)
lazy val sparkDebugger = project in file("spark-debugger")
.dependsOn(sparkProject)
.settings(
libraryDependencies ++= sparkDeps.map(_ % "compile")
)
当我们想在本地调试Spark时,我们从Debug Configuration窗口的sparkDebugger
项目中加载main方法: