当时在学习spark的时候,编译过spark2.11源码,当时也遇到过不少坑,导致编译过程坎坷。时过境迁,目前spark的最新版本是spark2.3.2。这次跟着官网指导编译一下最新代码。
前期注意事项
本人系统环境是windows10,IDE 为idea2017
本次编译是通过Maven编译,Maven版本为3.3.9,不用SBT编译
自Spark 2.2.0起,对Java 7的支持已被删除!
给Maven多配置一点内存,防止编译期间OOM异常,官网推荐
export MAVEN_OPTS="-Xmx2g -XX:ReservedCodeCacheSize=512m"
ReservedCodeCacheSize设置是可选的,但建议都加上否则可能出现警告或者异常。
[INFO] Compiling 203 Scala sources and 9 Java sources to /Users/me/Development/spark/core/target/scala-2.11/classes...
[ERROR] Java heap space -> [Help 1]
建议修改maven的安装目录下的conf/settings.xml文件中添加如下配置,以达到jar下载加速的效果
<!-- 阿里云中央仓库 --> <mirrors> <mirror> <id>alimaven</id> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <mirrorOf>central</mirrorOf> </mirror> </mirrors>
构建
去官网下载源码包
http://spark.apache.org/downloads.html
执行命令
./build/mvn -DskipTests clean package
spark编译要在 bash环境下进行 如git的bash环境,否则可能报错
开始编译 ,运行效果如下图:
此期间别急。机器不好的,网不好的,稍安勿躁,阿弥陀佛,等就对了。
37分钟后编译全部模块完成。
IntelliJ运行编译后的代码
打开IntelliJ idea open 编译过后的源代码,等待加载indexing,不要选import sbt project
找到org.apache.spark.examples中的一个example添加本地方法,测试运行。
image.png
官网中的提示:
“Rebuild Project” 第一次编译项目的时候可能失败,点击这个按钮“Generate Sources and Update Folders For All Projects”
有一些模块路径是idea识别不了的,需要手工选一下,在“Project Settings” 然后选中 “Modules” 模块。
spark-hive: add v0.13.1/src/main/scala
spark-streaming-flume-sink: add target\scala2.11\src_managed\main\compiled_avro
spark-catalyst: add target\scala-2.11\src_managed\main
比如idea执行报错,无法找到SparkFlumeProtocol类,进入view=>tool window=>maven project中找到Spark Project External Flume Sink模块,右键选择Generate Sources and update Folders,并在lifecycle中compile改模块。
执行测试类的时候出现Exception in thread "main" java.lang.NoClassDefFoundError: 错误
解决方法:
Menu -> File -> Project Structure -> Modules -> spark-examples_2.11 -> Dependencies 添加依赖 jars -> {spark dir}/spark/assembly/target/scala-2.11/jars/如果还碰到哪个模块导致找不到类在idea中选中单个maven模块重新mvn clean compile一下
其他编译命令
mvn 还可以加-P参数指定hadoop版本,指定构建Hive 、JDBC 、Mesos 、Kubernetes 、Kafka、Flume 的支持版本
./build/mvn -Pyarn -Phadoop-2.7 -Dhadoop.version=2.7.3 -DskipTests clean package
./build/mvn -Pyarn -Phive -Phive-thriftserver -DskipTests clean package
./build/mvn -Pmesos -DskipTests clean package
./build/mvn -Pkubernetes -DskipTests clean package
./build/mvn -Pkafka-0-8 -DskipTests clean package
./build/mvn -Pflume -DskipTests clean package
指定单一模块进行构建
如果修改了一个模块的源代码,想构建后跑起来的话,可以用-pl命令构建单个模块,节省大量时间。
./build/mvn -pl :spark-streaming_2.11 clean install
官网还推荐用make-distribution.sh脚本继续打包编译
./dev/make-distribution.sh --name custom-spark --pip --r --tgz -Psparkr -Phadoop-2.7 -Phive -Phive-thriftserver -Pmesos -Pyarn -Pkubernetes
***bash环境下运行上面命令,这个脚本和mvn本质一样,但会帮助我们自动设置maven参数和jvm参数,如脚本中就有这段代码export MAVEN_OPTS="${MAVEN_OPTS:--Xmx2g -XX:ReservedCodeCacheSize=512m}"
作者:梧上擎天
链接:https://www.jianshu.com/p/be462368503f