如果官方给的安装包不能满足我们生产环境的要求又或者我们基于自己的需求修改了spark源码,那么我们就需要对spark源码重新编译打包,相关方法和命令官网也写的特别清楚,我们只需要安装官网一步步操作即可,本文基于spark 2.1.0对源码进行编译和打包。
前置要求
- 首先构建方式是基于maven的,并且maven版本要求3.3.9或者3.3.9以上,jdk版本7或者7以上,官网是这么说的:Building Spark using Maven requires Maven 3.3.9 or newer and Java 7+
注意,如果你编译的是spark 2.2.0及其以上版本,那么要注意了,从2.2.0开始已经不支持jdk 7,也就是说必须是jdk 8或者jdk 8以上官网是这么说的:Building Spark using Maven requires Maven 3.3.9 or newer and Java 8+. Note that support for Java 7 was removed as of Spark 2.2.0. - 需要通过设置参数MAVEN_OPTS配置maven使用更多内存,即:
export MAVEN_OPTS="-Xmx2g -XX:ReservedCodeCacheSize=512m"
另外如果你使用的jdk 7那么还需要对MAVEN_OPTS添加如下设置:
-XX:MaxPermSize=512M
build
关于构建官网给了两种方式,分别是./build/mvn和./dev/make-distribution.sh,其实是maven源码包里给内置了安装了一个maven,直接使用mvn命令操作即可:
-
使用./build/mvn -Pyarn -Phadoop-2.4 -Dhadoop.version=2.4.0 -DskipTests clean package
其中-Pyarn指定激活yarn的profile,-Phadoop-2.4指定激活的hadoop的profile,-Dhadoop.version指定hadoop相关依赖包的版本,-DskipTests表示跳过测试代码进行编译打包,所以首先你得熟悉maven操作,至于说为什么要指定这些profile和依赖包版本,或者说我怎么看有哪些可供选择的profile和依赖包可以激活和指定呢,我们可以到源码包的pom.xml中一看便知,比如对应上边的命令我们可以找到如下几处:<profile> <id>hadoop-2.4</id> <properties> <hadoop.version>2.4.1</hadoop.version> <jets3t.version>0.9.3</jets3t.version> </properties> </profile> <profile> <id>yarn</id> <modules> <module>yarn</module> <module>common/network-yarn</module> </modules> </profile> <hadoop.version>2.2.0</hadoop.version> <protobuf.version>2.5.0</protobuf.version> <yarn.version>${hadoop.version}</yarn.version>
使用./dev/make-distribution.sh --name custom-spark --tgz -Psparkr -Phadoop-2.4 -Phive -Phive-thriftserver -Pmesos -Pyarn
--name指定最后生成的压缩包的名称,--tgz指定压缩格式,-P是激活一些profile,其实本质上还是调用mvn相关命令,只不过spark给我们封装了一下,注意如果你想打包成一个可发布版的安装包,那么你需要使用./dev/make-distribution.sh这个命令,具体怎么封装其实看下代码就知道了,打开./dev/make-distribution.sh文件,可以找到如下几处,一看就明白了:
压缩格式:
case $1 in
--tgz)
MAKE _TGZ=true
前置要求里配置的:
export MAVEN_OPTS="${MAVEN_OPTS:--Xmx2g -XX:MaxPermSize=512M -XX:ReservedCodeCacheSize=512m}"
去掉测试代码打包:
BUILD_COMMAND=("$MVN" -T 1C clean package -DskipTests $@)
打包名字全称,从如下代码可看出最后全名是这么来的spark-$VERSION-bin-$NAME.tgz,比如我打包完名字是:spark-2.1.0-bin-2.6.0-cdh5.7.0.tgz
if [ "$MAKE_TGZ" == "true" ]; then
TARDIR_NAME=spark-$VERSION-bin-$NAME
TARDIR="$SPARK_HOME/$TARDIR_NAME"
rm -rf "$TARDIR"
cp -r "$DISTDIR" "$TARDIR"
tar czf "spark-$VERSION-bin-$NAME.tgz" -C "$SPARK_HOME" "$TARDIR_NAME"
rm -rf "$TARDIR"
fi
To create a Spark distribution like those distributed by the Spark Downloads page, and that is laid out so as to be runnable, use
./dev/make-distribution.sh
in the project root directory.
如果不知道怎么使用可以通过./dev/make-distribution.sh --help可以查看关于此命令的帮助
默认spark是基于Hadoop 2.2.0构建的,所以如果你要使用其他版本或者说从其他版本的hdfs读取数据,那么你需要使用hadoop.version声明版本号,hadoop版本和对应要激活的profile对应关系是这样的:
Note that support for versions of Hadoop before 2.6 are deprecated as of Spark 2.1.0 and may be removed in Spark 2.2.0.
如果你需要使用yarn,那么要激活yarn的profile,默认yarn的版本跟hadoop版本是一样,不需要单独声明,这一点从上边pom.xml摘的几处代码那里也可以看出,但是有时候你可能需要yarn的版本不同于hdfs版本,那么就需要使用yarn.version显示声明yarn版本,spark仅支持2.2.0及以上的yarn版本。
除了激活hadoop相关组件,还可以激活比如Hive、JDBC、Mesos 等等
Spark源码编译中的坑:
首先,如果在编译过程中,看到的异常信息不是太明显或者说看不太懂,可以在编译命令后 -X,就能看到更详细的编译信息
坑一:jar包down不下来
pom.xml添加cdh版的maven仓库
<repository>
<id>cloudera</id>
<url>https://repository.cloudera.com/artifactory/cloudera-repos/</url>
</repository>
坑二:内存报错
export MAVEN_OPTS="-Xmx2g -XX:ReservedCodeCacheSize=512m -XX:MaxPermSize=512M"
其实make-distribution.sh里面默认已经加上了这一句
注意点:阿里云的机器,机器内存可能是有限的,建议VM至少2-4G
坑三:
如果编译的scala版本是2.10
./dev/change-scala-version.sh 2.10
./dev/change-scala-version.sh 2.11
坑四:
was cached in the local repository,resolution will not be reattempted until the update interval of nexus has ........这种特别常见,以前使用nexus的maven私服的时候如果网不好或者镜像源不好就会出现xxx.lastUpdated文件
解决方式:
- 去仓库把xxx.lastUpdated文件全部删除,重新执行maven命令
- 编译命令后面加 -U
以上就是spark源码编译的内容,必要的时候可以到官网查看http://spark.apache.org/docs/2.1.0/building-spark.html