Spark源码阅读环境搭建(基于idea+maven和eclipse+sbt)

本实验提供两种方式编译spark源码

(1)idea+maven

需要安装好idea、maven和scala,并配置好对应的环境变量。

(2)eclipse+sbt

需要安装好Eclipse Scala IDE、sbt和scala,并配置好对应的环境变量。Eclipse Scala IDE是Eclipse专门用于开发Scala程序的IDE。

(3)版本

spark-2.1.0

scala-2.11.8

apache-maven-3.5.4

SBT-1.2.8.MSI

无论采用哪种方式编译都需要下载spark源码,地址:spark-2.1.0

maven+idea方式

编译Spark源码

        进入spark源码目录(pom.xml所在目录),执行如下maven编译命令:

mvn -T 8 -DskipTests clean package

8表示编译源码的线程数量,可以根据自己的环境设置。执行命令后会下载很多的依赖jar包,需要等待一段时间,具体根据网速而定。 如果编译成功,最后会出现BUILD SUCCESS字样,如果编译失败,可能是因为网络原因,下载jar包失败,可以多次执行上面的编译命令(本实验执行了两次)。编译成功后,进入spark源码的bin目录下,执行spark-shell命令,如果编译成功,会正常启动scala命令行,如图:

Spark源码导入IDEA

打开idea,如图:

依次点击File-->New-->Project from Existing Sources...,选择刚编译好的Spark源码目录,如图:

后面有一步需要选择Maven,然后一直next到完成即可,成功导入后,界面如图:

测试

以经典的wordcount程序为例,程序所在目录如图:

运行程序前,配置如下参数:

-Dspark.master=local表示本地模式运行(-D是java参数),wordcount.txt是需要统计的单词文件,具体内容如下:

Hello World
Hello word
the word is mine

配置好后运行该程序,请耐心等待一会(正在building),最后会出现一系列错误,如图:

Error:(45, 66) not found: type SparkFlumeProtocol
  val transactionTimeout: Int, val backOffInterval: Int) extends SparkFlumeProtocol with Logging {
Error:(70, 39) not found: type EventBatch
  override def getEventBatch(n: Int): EventBatch = {
Error:(85, 13) not found: type EventBatch
        new EventBatch("Spark sink has been stopped!", "", java.util.Collections.emptyList())

解决办法,如图:

依次点击View-->Tool Windows-->Maven Projects,如图:

运行程序后,还是报错,如下:

java.lang.NoClassDefFoundError: org/apache/spark/api/java/function/FlatMapFunction
    at java.lang.Class.getDeclaredMethods0(Native Method)
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
    at java.lang.Class.privateGetMethodRecursive(Class.java:3048)
    at java.lang.Class.getMethod0(Class.java:3018)
    at java.lang.Class.getMethod(Class.java:1784)
    at sun.launcher.LauncherHelper.validateMainClass(LauncherHelper.java:544)
    at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:526)
Caused by: java.lang.ClassNotFoundException: org.apache.spark.api.java.function.FlatMapFunction
    at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 7 more
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" 

解决办法,如下添加依赖包,

将项目的assembly目录下的scala-2.11下的jar包添加进来,如图:

程序运行结果,如图:

到此算是顺利编译成功了。但这还不算真正的成功,以后可能在使用其他模块时,也会报错,遇到问题先不要慌,解决办法同上。

总结:maven编译其实是下载写Spark源码时依赖的其他jar包,但会因为某些原因(比如网络或者下载源不存在)导致编译显示成功,而实际一些包还未下载下来。最后导入IDEA后,不能正常运行程序。解决思路就是需要什么jar包,下载相应jar包。本实验中使用了两种方式,第一种是生成和更新项目的方式,第二种是添加已经存在的jar包。

eclipse+sbt方式

使用sbt编译,需要先按照sbt,如下:

sbt安装

下载地址:SBT-1.2.8.MSI

配置环境变量

新建SBT_HOME=E:\sbt

在path变量最后添加%SBT_HOME%\bin

注意:path变量每个配置之间都使用分号";"分开。

编译Spark源码

进入Spark源码目录(pom.xml文件所在目录),执行sbt命令,如图:

这需要等待很长时间(如果从时间来考虑,选择idea+maven方式更好)。等出现>提示符后,输入eclipse命令,等待一段时间后,如图:

表示已经编译成功。

Spark源码导入Eclipse

发布了89 篇原创文章 · 获赞 79 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/L_15156024189/article/details/88857632