线程"main"中的异常 java.lang.NoClassDefFoundError: org/apache/spark/rdd/RDD



请注意,我比程序员更擅长数据挖掘。我正在尝试运行作者Sandy Ryza的《使用Spark进行高级分析》一书中的示例(这些代码示例可以从https://github.com/sryza/aas"),我遇到了以下问题。当我在Intelij Idea中打开这个项目并尝试运行它时,我会收到错误"线程中的异常"main"java.lang.NoClassDefFoundError:org/apache/spark/rdd/rdd"有人知道如何解决这个问题吗
这是否意味着我使用了错误版本的火花?

首先,当我尝试运行此代码时,我得到了错误"线程中的异常"main"java.lang.NoClassDefFoundError:scala/product",但我通过将scala-lib设置为在maven中编译来解决它。我使用Maven 3.3.9、Java 1.7.0_79和scala 2.11.7、spark 1.6.1。我尝试了Intelij Idea 14和15个不同版本的java(1.7)、scala(2.10)和spark,但都没有成功。我也在使用Windows7。我的SPARK_HOME和Path变量已经设置好,我可以从命令行执行sparkshell。

本书中的示例将向sparkshell显示一个--master参数,但您需要指定适合您的环境的参数。如果你没有安装Hadoop,你需要在本地启动sparkshell。要执行示例,您可以简单地将路径传递到本地文件引用(file:///),而不是HDFS引用(HDFS://)

作者提出了一种混合开发方法:

在REPL中保留开发的前沿,并且,作为代码片段硬化,将它们移到已编译的库中。

因此,示例代码被视为已编译的库,而不是独立的应用程序。您可以通过将编译后的JAR传递给--jars属性,使其可用于sparkshell,而maven用于编译和管理依赖关系。

在书中,作者描述了如何执行简单的sparkproject:

使用maven编译和打包项目

cd simplesparkproject/
mvn package 

使用jar依赖启动spark shell

spark-shell --master local[2] --driver-memory 2g --jars ../simplesparkproject-0.0.1.jar ../README.md

然后,您可以访问火花壳内的对象,如下所示:

val myApp = com.cloudera.datascience.MyApp

然而,如果您想将示例代码作为独立应用程序执行并在idea中执行,则需要修改pom.xml。有些依赖项是编译所必需的,但在spark运行时环境中是可用的。因此,这些依赖关系用pom.xml中提供的作用域进行标记

<!--<scope>provided</scope>-->

您可以重新制作所提供的范围,而不是在idea中运行示例。但是您不能再将这个jar作为sparkshell的依赖项提供了。

注意:使用maven 3.0.5和Java 7+。我遇到了maven3.3.X版本和插件版本的问题。

相关内容

最新更新