背景
通常来讲,spark的使用离不开hadoop生态,在spark的官网中已经有针对hadoop通用版本(比如2.6、2.7)的预编译版本。但是在实际生产环境中使用的hadoop一般是cdh或hdp,与spark预编译版本可能会有兼容性的问题,所以要编译针对特定hadoop版本的spark。
版本
- hadoop:2.6.0-cdh5.4.7
- spark:2.3.1
maven 编译
前提条件
1.maven版本在3.3.9以上并且jdk在1.8以上
2.设置MAVEN_OPTS,以便在编译时可以用更多的内存空间
export MAVEN_OPTS="-Xmx2g -XX:ReservedCodeCacheSize=512m"
了解pom文件
在编译之前我们首先了解一下spark源码中的pom文件,首先在<properties/>中提供了编译spark时各组件的默认版本:如图所示,编译spark时默认的hadoop版本是2.6.5,编译时可以通过-D的方式指定组件版本。
编译
mvn -Pyarn -Phive -Phadoop-2.6 -Dhadoop.version=2.6.0-cdh5.4.7 -Phive-thriftserver -DskipTests clean package
上述命令编译的spark支持yarn、hive、hadoop2.6,同时指定了hadoop的版本。
编译可运行的spark包
在spark的源码的dev目录下提供了一个名叫make-distribution.sh的脚本来编译一个可运行的spark包,具体用法如下:
./dev/make-distribution.sh --name 2.6.0-cdh5.4.7 --tgz -Phadoop-2.6 -Phive -Phive-thriftserver -Pyarn -Dhadoop.version=2.6.0-cdh5.4.7
该脚本实际用的是上面介绍的mvn编译,具体用法可以通过执行./dev/make-distribution.sh --help来查看。
编译时遇到的问题
问题一:
[ERROR] Failed to execute goal on project spark-launcher_2.11: Could not resolve dependencies for project org.apache.spark:spark-launcher_2.11:jar:2.3.1: Could not find artifact org.apache.hadoop:hadoop-client:jar:2.6.0-cdh5.4.7 in central (https://repo.maven.apache.org/maven2) -> [Help 1]
解决:这是由于编译时找不到hadoop对应的maven库,只要在spark的pom文件中加入cdh的maven仓库即可
<repositories>
<repository>
<id>cloudera</id>
<url>https://repository.cloudera.com/artifactory/cloudera-repos/</url>
</repository>
</repositories>