前言
因为实际业务需求的复杂性,不可避免地需要修改spark源码,重新编译并测试完成后应用于线上生产环境。本文主要介绍在 centos 7.4 上重新编译 spark-2.4.2 源码的过程及遇到的问题。
一. 下载源码
进入spark官网:http://spark.apache.org/ 点击进入下载页面
找到下面的Archived Releases,点击 release archives.
进入后,选择spark2.4.2,右键复制下载地址
在linux中运行:wget http://mirrors.tuna.tsinghua.edu.cn/apache/spark/spark-2.4.2/spark-2.4.2.tgz
解压:tar -zxvf spark-2.4.2.tgz -C /bigdata/apps
二. 编译前准备
进入spark2.4.2关于编译的说明页面:http://spark.apache.org/docs/2.4.2/building-spark.html
可以看出编译spark源码的环境需要Maven3.5.4 和 Java 8
- 首先安装java 8
tar -zxvf jdk-8u171-linux-x64.tar.gz -C /bigdata/apps/
vim ~/.bash_profile
export JAVA_HOME=/usr/java/jdk1.8.0_171
export PATH=$JAVA_HOME/bin:$PATH
source ~/.bash_profile
验证:java -version
- 安装maven-3.5.4
tar -zxvf apache-maven-3.5.4-bin.tar.gz -C /bigdata/apps/
vim ~/.bash_profile
export MAVEN_HOME=/bigdata/apps/apache-maven-3.5.4
export PATH=$ MAVEN_HOME/bin:$PATH
source ~/.bash_profile
验证:mvn -v
建议:修改修改maven本地仓库存放位置和下载地址,即apache-maven-3.5.4/conf目录下的settings.xml文件:
<localRepository>/bigdata/maven_repo</localRepository
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
- 安装scala-2.11.12
tar -zxvf scala-2.11.12.tgz -C /bigdata/apps
vim ~/.bash_profile
export SCALA_HOME=/bigdata/apps/scala-2.11.12
export PATH=$SCALA_HOME/bin:$PATH
source ~/.bash_profile
验证:scala
- 安装git
yum install git -y
三. 编译源码
- 根据官网
为了防止内存不够,执行如下语句:
export MAVEN_OPTS="-Xmx2g -XX:ReservedCodeCacheSize=512m"
- (可选)修改/bigdata/apps/spark-2.4.2/dev/make-distribution.sh 文件,屏蔽其中的相应变量,添加如下代码,目的是为了加快编译速度,实测中发现也没快多少,所以也可以不做修改。
VERSION=2.4.2 # spark 版本
SCALA_VERSION=2.11 # scala 版本
SPARK_HADOOP_VERSION=2.6.0-cdh5.16.1 #对应的 hadoop 版本
SPARK_HIVE=1 # 支持的 hive
- 修改 pom.xml 仓库,添加阿里云(maven中已配置过,这里不重复配置)和 cloudera 仓库地址。
屏蔽代码:
<!-- <repository> <id>central</id> This should be at top, it makes maven try the central repo first and then others and hence faster dep resolution <name>Maven Repository</name> <url>https://repo.maven.apache.org/maven2</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots> </repository> -->
添加代码:
<repository> <id>cloudera</id> <url>https://repository.cloudera.com/artifactory/cloudera-repos/</url> </repository>
-
运行编译命令
cd /bigdata/apps/spark-2.4.2/
./dev/make-distribution.sh
--name 2.6.0-cdh5.16.1
--tgz
-Dhadoop.version=2.6.0-cdh5.16.1
-Phadoop-2.6
-Phive
-Phive-thriftserver
-Pyarn
参数介绍:
--name:指定编译后部分名字
--tgz:编译后打包成 tgz 文件
-Dhadoop.version: 同-Phadoop,一般和 name 相同;
-Phadoop:Hadoop版本号,默认版本2.6.5;
-Phive:是否在Spark SQL 中支持 hive,hive 默认版本1.2.1;
-Phive-thriftserver:同-Phive;
-Pyarn :是否支持Hadoop YARN;
- 编译成功后,会显示 BUILD SUCCESS,并在 spark-2.4.2 文件夹下生成一个 tgz 包:
spark-2.4.2-bin-2.6.0-cdh5.16.1.tgz
四. 编译过程中遇到的问题及处理
- 开始编译源码后,观察控制台编译日志发现会在 spark-2.4.2/build 目录下下载 scala 和 zinc 的 tgz 包,过程会很慢。此时,可进入 build 目录,把手动下载好的 tgz 包粘贴到这里,重新执行编译。
- 出现如下错误:
修改 spark-2.4.2 文件夹中的 pom.xml 文件,找到 net.alchim31.maven 的配置处,将版本号由 3.2.2 改为 3.2.0 即可。
- 编译过程中,可能出现某个jar包缺失或损坏,手动下载对应版本拷贝到指定位置即可。