一、背景
从Spark官网https://spark.apache.org/ 下载的预编译版本的Spark,受到诸多限制:
1. 比如我们生产环境使用的Hadoop是CDH版本,那么从官网下载的预编译版本就不能使用;
2. 为了兼容Spark新特性,生产环境只升级了HDFS组件,那么预编译版本也不能使用;
因此,为了更好的兼容生产环境中大数据生态组件,我们必须学会如何编译Spark源码。
二、前置条件
1. 官网下载Spark源码
2. 查看官方文档,确定前置条件
Spark2.2.0版本文档地址:https://spark.apache.org/docs/2.2.0/
根据需要编译的Spark版本,查看对应到官网文档,里面有必备的条件,比如本文的:
条件1:Maven 3.3.9 版本及以上
条件2:Java 8 版本及以上
3. Maven配置文件增加阿里镜像
进到Maven的安装路径,有个conf文件夹,找到settings.xml 文件,在<mirrors>标签下增加如下内容:
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
4. 解压源码并修改pom.xml文件
tar -zxvf spark-2.2.0.tgz -C ./
解压后,得到 spark-2.2.0 文件夹。
由于本文需要编译的Hadoop版本是2.6.0-CDH5.7.0版本,编译过程中需要下载CDH相关的包,因此在pom文件需要添加cloudera仓库。
<repository>
<id>cloudera</id>
<name>cloudera Repository</name>
<url>https://repository.cloudera.com/artifactory/cloudera-repos/</url>
</repository>
三、编译步骤
官网里介绍了两种编译方式,一是mvn,另外是 make-distribution.sh;下面分别介绍具体实现。
3.1 Apache Maven
1. 设置Maven的工作使用内存
export MAVEN_OPTS="-Xmx2g -XX:ReservedCodeCacheSize=512m"
不设置会报以下错误:
[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]
2. build/mvn
进到解压后源码文件夹下,执行如下命令:
./build/mvn -Pyarn -Phadoop-2.6 -Phive -Phive-thriftserver -Dhadoop.version=2.6.0-cdh5.7.0 -DskipTests clean package
3.2 Building a Runnable Distribution
编译成可部署在分布式系统上的可执行版本,方便后续安装,这种方法是本文推荐使用的。
./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
注:
--name 应用于编译生成的tgz文件的文件名
-Dhadoop.version 写需要安装到机器的Hadoop版本
-Phive -Phive-thriftserver 是为了支持hive和thriftserver
编译时间取决于网速,本文在服务器上编译时间大概是半个小时,成功界面如下:
生成的文件是:spark-2.2.0-bin-2.6.0-cdh5.7.0.tgz
接着就可以把这个文件分发到节点,进行安装。
Just enjoy it !