Spark
官网提供了多种利用Maven编译Spark源码的方式,编译之前需要配置所需环境,Maven
版本必须是3.3.9
或者更高,JDK
必须是1.8
或者更高。 export MAVEN_OPTS="-Xmx2g -XX:ReservedCodeCacheSize=512m"
Spark
自带的Maven编译:在解压后的Spark源码的build目录中运行./mvn -Pyarn -Phadoop-2.4 -Dhadoop.version=2.4.0 -DskipTests clean package
,Hadoop的版本根据自己的环境进行设置,具体的依赖也可以根据业务需求进行拼接相应的依赖。make-distribution.sh
编译(推荐)在:在解压后的Spark源码的dev目录中运行./make-distribution.sh --name 2.6.0-cdh5.7.0 --tgz -Pyarn -Phadoop-2.6 -Dhadoop.version=2.6.0-cdh5.7.0 -Phive -Phive-thriftserver
。Hadoop的版本根据自己的环境进行设置,具体的依赖也可以根据业务需求进行拼接相应的依赖。这种编译方式出来的是一种能够解压运行的tgz
包。编译Spark:
tar -zxvf spark-2.2.0.tgz
编译:我用到的编译方式就是Spark
的make-distribution.sh
来编译。编译命令在解压后的Spark
目录下的dev
目录,里边有一个make-distribution.sh
命令,我们就用这个命令来编译Spark
。命令中的一些参数要根据自己的hadoop环境来指定对应的版本,hadoop的版本根据自己的实际环境来指定版本,我用的是CDH版本的hadoop。编译后的tgz
包在Spark
源码的根目录。命令如下:
./make-distribution.sh --name 2.6.0-cdh5.7.0 --tgz -Pyarn -Phadoop-2.6 -Dhadoop.version=2.6.0-cdh5.7.0 -Phive -Phive-thriftserver
//以上命令解释
./make-distribution.sh --name 2.6.0-cdh5.7.0 \ //指定打成tgz包的名字
--tgz \ //指定打成tgz包
-Pyarn -Phadoop-2.6 \ //指定hadoop profile版本,并指定运行在Yarn上
-Dhadoop.version=2.6.0-cdh5.7.0 \ //指定hadoop版本
-Phive -Phive-thriftserver //添加Hive依赖
distribution.sh命令部分详解:在该脚本中我们可以看到我们的命令为什么不需要设置Maven
的使用内存大小,也不需要设置忽略测试、以及设置--name
以后编译出来的tgz
包的名字.
export MAVEN_OPTS="${MAVEN_OPTS:--Xmx2g -XX:MaxPermSize=512M -XX:ReservedCodeCacheSize=512m}"//已经设置了Maven使用的内存大小
BUILD_COMMAND=("$MVN" -T 1C clean package -DskipTests $@) //将忽略测试已经拼到了命令中了
TARDIR_NAME=spark-$VERSION-bin-$NAME //根据编译指定的--name,那么编出来的tar包的名字为spark-2.2.0-bin-2.6.0-cdh5.7.0.tar
Hadoop版本与Profile对应关系:
Hadoop version | Profile required |
---|---|
2.2.x | hadoop-2.2 |
2.3.x | hadoop-2.3 |
2.4.x | hadoop-2.4 |
2.6.x | hadoop-2.6 |
2.7.x and later 2.x | hadoop-2.7 |
编译中出现的问题:
Java
环境变量Maven
环境变量Hadoop
为CDH
版本的时候找不到CDH
版本的Hadoop
,那么解决方案是在Spark
源码的pom.xml
文件中添加CDH
版本的仓库,并且一定要添加在repositories
标签的最后边。在repositories
标签添加如下配置。 <repository>
<id>cloudera-releases</id>
<url>https://repository.cloudera.com/artifactory/cloudera-repos</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>