NoClassDefFoundError:SparkSession - 即使构建正在运行

Mak*_*e42 16 scala apache-spark

我将https://github.com/apache/spark/blob/master/examples/src/main/scala/org/apache/spark/examples/ml/RandomForestClassifierExample.scala复制到一个新项目并设置build.sbt

name := "newproject"
version := "1.0"
scalaVersion := "2.11.8"

javacOptions ++= Seq("-source", "1.8", "-target", "1.8")
scalacOptions += "-deprecation"

libraryDependencies ++= Seq(
  "org.apache.spark" % "spark-core_2.11"  % "2.0.0" % "provided",
  "org.apache.spark" % "spark-sql_2.11"   % "2.0.0" % "provided",
  "org.apache.spark" % "spark-mllib_2.11" % "2.0.0" % "provided",
  "org.jpmml" % "jpmml-sparkml" % "1.1.1",
  "org.apache.maven.plugins" % "maven-shade-plugin" % "2.4.3",
  "org.scalatest" %% "scalatest" % "3.0.0"
)
Run Code Online (Sandbox Code Playgroud)

我可以从IntelliJ 2016.2.5构建它,但是当我收到错误时我

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/spark/sql/SparkSession$
    at org.apache.spark.examples.ml.RandomForestClassifierExample$.main(RandomForestClassifierExample.scala:32)
    at org.apache.spark.examples.ml.RandomForestClassifierExample.main(RandomForestClassifierExample.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:147)
Caused by: java.lang.ClassNotFoundException: org.apache.spark.sql.SparkSession$
    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
Run Code Online (Sandbox Code Playgroud)

我甚至可以点击SparkSession并获得源代码.问题是什么?

Thi*_*ilo 22

当你说provided你的依赖项时,构建将针对该依赖项进行编译,但它不会在运行时添加到类路径中(假设它已经存在).

这是构建Spark作业时的正确设置spark-submit(因为它们将在提供依赖关系的Spark容器内运行,并且第二次包含它会导致麻烦).

但是,当您在本地运行时,您需要存在该依赖项.因此,要么将构建更改为不具有此功能provided(但是在构建提交作业时需要调整它),或者在IDE中将运行时类路径配置为已具有该jar文件.

  • 在IntelliJ中,您可以转到“运行配置”,然后单击“包含具有“提供”范围的依赖项”。 (6认同)
  • 谢谢你。我如何为 Spark“配置 [IntelliJ] 中的 [我的] 运行时类路径,使其已经拥有该 jar 文件”?我找到了 http://stackoverflow.com/a/24843914/4533188 - 我是否添加文件夹“spark-2.0.1-bin-hadoop2.7/jars”?这就是我尝试过的,但它不起作用:我再次收到“NoClassDefFoundError”。 (2认同)

Gar*_*n S 6

就我而言,我使用的是本地 Cloudera CDH 5.9.0 集群,默认情况下安装了 Spark 1.6.1,并将 Spark 2.0.0 作为包裹安装。因此,spark-submit使用 Spark 1.6.1 而使用spark2-submitSpark 2.0.0。由于1.6.1中不存在SparkSession,所以抛出了这个错误。使用正确的spark2-submit命令解决了问题。