本实验提供两种方式编译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
进入spark源码目录(pom.xml所在目录),执行如下maven编译命令:
mvn -T 8 -DskipTests clean package
8表示编译源码的线程数量,可以根据自己的环境设置。执行命令后会下载很多的依赖jar包,需要等待一段时间,具体根据网速而定。 如果编译成功,最后会出现BUILD SUCCESS字样,如果编译失败,可能是因为网络原因,下载jar包失败,可以多次执行上面的编译命令(本实验执行了两次)。编译成功后,进入spark源码的bin目录下,执行spark-shell命令,如果编译成功,会正常启动scala命令行,如图:
打开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包。
使用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