java.lang.NoClassDefFoundError:org / apache / spark / sql / SparkSession

时间:2017-07-31 09:51:55

标签: java apache-spark

我用Java编写了一个Spark Job。当我提交作业时,它会给出以下错误:

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/spark/sql/SparkSession
        at com.thinkbiganalytics.veon.util.SparkSessionBuilder.getOrCreateSparkSession(SparkSessionBuilder.java:12)
        at com.thinkbiganalytics.veon.AbstractSparkTransformation.initSparkSession(AbstractSparkTransformation.java:92)
        at com.thinkbiganalytics.veon.transformations.SDPServiceFeeDeductionSourceToEventStore.init(SDPServiceFeeDeductionSourceToEventStore.java:57)
        at com.thinkbiganalytics.veon.AbstractSparkTransformation.doTransform(AbstractSparkTransformation.java:51)
        at com.thinkbiganalytics.veon.transformations.SDPServiceFeeDeductionSourceToEventStore.main(SDPServiceFeeDeductionSourceToEventStore.java:51)
        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 org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:745)
        at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:181)
        at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:206)
        at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:121)
        at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
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 java.lang.ClassLoader.loadClass(ClassLoader.java:357)

6 个答案:

答案 0 :(得分:5)

您可能正在使用较低Spark版本的群集上部署应用程序。

请检查群集上的Spark版本 - 它应该与pom.xml中的版本相同。还请注意,当您使用spark-submit部署应用程序时,所有Spark依赖项都应标记为provided

答案 1 :(得分:4)

如果您从 Intellij IDEA 内部运行,并且您已将 Spark 库标记为“已提供”,如下所示:"org.apache.spark" %% "spark-sql" % "3.0.1" % "provided",那么您需要编辑您的运行/调试配置并选中“包含依赖项”提供范围”框。

答案 2 :(得分:3)

提交时

spark-submit

检查你的项目是否应该与pom.xml中的spark版本相同,

这可能是因为您在同一台计算机上有两个spark版本

为此您可以创建两个不同的软链接,并可以使用您构建项目的确切spark版本

spark1-submit -> /Users/test/sparks/spark-1.6.2-bin-hadoop2.6/bin/spark-submit

spark2–submit -> /Users/test/sparks/spark-2.1.1-bin-hadoop2.7/bin/spark-submit

或者可能是因为您使用更高的spark版本构建项目 并部署在具有较低spark-version

的群集上

为此您必须升级群集中的spark版本。 cloudera为它提供支持 https://community.cloudera.com/t5/Advanced-Analytics-Apache-Spark/Multiple-Spark-version-on-the-same-cluster/td-p/39880

答案 3 :(得分:1)

根据您获得的异常,我认为需要jar,您需要在类路径中添加所需的jar,这将解决问题。

请参阅此link以下载所需的jar

答案 4 :(得分:1)

从Intellij编辑器运行时遇到了这个问题。我已经标记了pom.xml中提供的火花罐,请参见下文:

<dependency>
     <groupId>org.apache.spark</groupId>
     <artifactId>spark-sql_2.11</artifactId>
     <version>2.4.0</version>
     <scope>provided</scope>
 </dependency>

在删除提供的范围时,错误消失了。

在制作提供的火花罐时,只有在使用spark-submit运行应用程序或将火花罐放在类路径上时才会提供它们

答案 5 :(得分:0)

泄漏火花环境会导致这个问题 如果您使用的是Intellij IDEA,则可以执行以下步骤: 文件->项目结构->模块-> spark-examples_2.11->依赖关系 jars-> {spark dir} /spark/assembly/target/scala-2.11/jars /