基于CentOS6环境编译Spark-2.1.0源码

1 写在前面的话

有些小伙伴可能会问:Spark官网不是已经提供了Spark针对不同版本的安装包了吗,我们为什么还需要对Spark源码进行编译呢?针对这个问题我们到Spark官网: spark.apache.org来看下,如下图所示:

Spark官网的确是提供了一些Hadoop版本的Spark安装包,但是提供的这些是否能够满足我们的要求呢?答案肯定是否定的,根据本人近几年做Spark的开发经验,列出如下几点

  • 在生产环境中Hadoop的选型,很大部分都是CDH或者HDP系列的,那么官方提供的这几个Hadoop系列是否能够生产的需求?
  • 在开发过程中,我们经常会遇到需要对Spark的源码进行修改,那么修改后的代码如何集成到Spark安装包中去呢?

针对如上列出的两点的个人觉得比较好的最佳实践:

  • 根据生产上运行的Hadoop版本编译出Spark的安装包
  • 修改Spark源码之后,重新编译Spark

所以:个人觉得如果想更好的学习和使用Spark,那么第一步就是要会根据Spark源码编译出安装包。

2 前置准备

根据Spark官方文档编译模块的介绍(http://spark.apache.org/docs/2.1.0/building-spark.html)的介绍:
The Maven-based build is the build of reference for Apache Spark. Building Spark using Maven requires Maven 3.3.9 or newer and Java 7+. Note that support for Java 7 is deprecated as of Spark 2.0.0 and may be removed in Spark 2.2.0.”
我们得知:
Java需要7+版本,而且在Spark2.0.0之后Java 7已经被标识成deprecated了,但是不影响使用,但是在Spark2.2.0版本之后Java 7的支持将会被移除;
Maven需要3.3.9+版本
2.1 Java7的安装
2.1.1 下载
Java SE安装包下载地址:http://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase7-521261.html
本文章我们使用的JDK版本是:jdk1.7.0_51
2.1.2 安装
我们所有的软件都安装在hadoop用户的根目录的app文件夹下
//解压 tar -zxvf jdk-7u51-linux-x64.tar.gz -C ~/app //将JDK目录添加到系统环境变量(~/.bash_profile)中 export JAVA_HOME=/home/hadoop/app/jdk1.7.0_51 export PATH=$JAVA_HOME/bin:$PATH //让配置文件生效 source ~/.bash_profile //执行java,查看java版本 java -version //如果安装成功后,则有如下信息的输出 java version "1.7.0_51" Java(TM) SE Runtime Environment (build 1.7.0_51-b13) Java HotSpot(TM) 64-Bit Server VM (build 24.51-b03, mixed mode)
2.2 Maven3.3.9的安装
2.2.1 下载
Maven3.3.9安装包下载地址:https://mirrors.tuna.tsinghua.edu.cn/apache//maven/maven-3/3.3.9/binaries/
2.2.2 安装

// 解压
tar -zxvf apache-maven-3.3.9-bin.tar.gz -C ~/app/

//将JDK目录添加到系统环境变量(~/.bash_profile)中
export MAVEN_HOME=/home/hadoop/app/apache-maven-3.3.9
export PATH=$MAVEN_HOME/bin:$PATH

//让配置文件生效
source  ~/.bash_profile

//执行mvn,查看版本
mvn -v

//如果安装成功后,则有如下信息的输出
Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-10T08:41:47-08:00)
Maven home: /home/hadoop/app/apache-maven-3.3.9
Java version: 1.7.0_51, vendor: Oracle Corporation
Java home: /home/hadoop/app/jdk1.7.0_51/jre
Default locale: zh_CN, platform encoding: UTF-8
OS name: "linux", version: "2.6.32-358.el6.x86_64", arch: "amd64", family: "unix"

2.3 Spark-2.1.0源码下载

下载地址:http://spark.apache.org/downloads.html

http://archive.apache.org/dist/spark/spark-2.1.0/

下载完成后解压即可,解压后的目录结构如下图所示

3 Spark源码编译

查看官方文档编译源码部分:http://spark.apache.org/docs/2.1.0/building-spark.html#building-a-runnable-distribution
我们可以使用Spark源码目录中的dev下的make-distribution.sh脚本,官方提供的编译命令如下:
./dev/make-distribution.sh --name custom-spark --tgz -Psparkr -Phadoop-2.4 -Phive -Phive-thriftserver -Pmesos -Pyarn
参数说明:

  • --name:指定编译完成后Spark安装包的名字
  • --tgz:以tgz的方式进行压缩
  • -Psparkr:编译出来的Spark支持R语言
  • -Phadoop-2.4:以hadoop-2.4的profile进行编译,具体的profile可以看出源码根目录中的pom.xml中查看
  • -Phive和-Phive-thriftserver:编译出来的Spark支持对Hive的操作
  • -Pmesos:编译出来的Spark支持运行在Mesos上
  • -Pyarn:编译出来的Spark支持运行在YARN上

那么我们可以根据具体的条件来编译Spark,比如我们使用的Hadoop版本是2.6.0-cdh5.7.0,并且我们需要将Spark运行在YARN上、支持对Hive的操作,那么我们的Spark源码编译脚本就是:

./dev/make-distribution.sh --name 2.6.0-cdh5.7.0 --tgz -Pyarn -Phadoop-2.6 -Phive -Phive-thriftserver -Dhadoop.version=2.6.0-cdh5.7.0

编译成功后,在Spark源码的根目录中就spark-2.1.0-bin-2.6.0-cdh5.7.0.tgz包,那么我们就可以使用编译出来的这个安装包来进行Spark的安装了。

有小伙伴可能会问,为什么编译出来的安装包的名称是spark-2.1.0-bin-2.6.0-cdh5.7.0.tgz呢?我们可以带着这个疑惑,查看make-distribution.sh的源码,在该脚本的最后部分,有如下代码:

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

该VERSION就是我们Spark的版本即2.1.0,NAME就是我们在编译时指定的2.6.0-cdh5.7.0,所以根据该脚本最终输出的Spark安装包的全称为: spark-2.1.0-bin-2.6.0-cdh5.7.0.tgz。通过该代码的查看希望大家能明白一个问题:源码面前,了无秘密。
注意:在编译过程中会出现下载某个依赖包的时间太久,这是由于网络问题,可以执行ctrl+c停止编译命令,然后重新运行编译命令,在编译过程中多试几次即可。有条件的小伙伴,建议开着VPN然后再进行编译,整个编译过程会顺畅很多。
使用maven编译
Building Spark using Maven requires Maven 3.3.9 or newer and Java 8+
export MAVEN_OPTS="-Xmx2g -XX:ReservedCodeCacheSize=512m"
// 前提,需要对源码有一定的了解
./build/mvn -Pyarn -Phadoop-2.7 -Dhadoop.version=2.7.3 -DskipTests clean package
// 编译一个可运行的包
./dev/make-distribution.sh --name custom-spark --pip --r --tgz -Psparkr -Phadoop-2.7 -Phive -Phive-thriftserver -Pmesos -Pyarn -Pkubernetes

// pom 上述命令制定-D的含义
    <hadoop.version>2.2.0</hadoop.version>
    <protobuf.version>2.5.0</protobuf.version>
    <yarn.version>${hadoop.version}</yarn.version>

// pom 上述命令制定-P的含义
    <profile>
      <id>hadoop-2.6</id>
      <properties>
        <hadoop.version>2.6.4</hadoop.version>
        <jets3t.version>0.9.3</jets3t.version>
        <zookeeper.version>3.4.6</zookeeper.version>
        <curator.version>2.6.0</curator.version>
      </properties>
    </profile>
编译命令如下:
./build/mvn -Pyarn -Phadoop-2.6 -Phive -Phive-thriftserver -Dhadoop.version=2.6.0-cdh5.7.0 -DskipTests clean package
或 (推荐使用)
./dev/make-distribution.sh --name 2.6.0-cdh5.7.0 --pip --r --tgz -Psparkr -Phadoop-2.6 -Phive -Phive-thriftserver -Pmesos -Pyarn -Pkubernetes Dhadoop.version=2.6.0-cdh5.7.0

如果编译过程中看到的信息不是太懂。编译命令后加上 -X,就能看到更详细的信息 前人经验https://blog.csdn.net/chen_1122/article/details/77935149?locationNum=3&fps=1

4.编译过程中遇到的问题

【问题1】

[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.2.0: Failure to find org.apache.hadoop:hadoop-
client:jar:2.6.0-cdh5.7.0 in https://repo1.maven.org/maven2 was cached in the 
local repository, resolution will not be reattempted until the update interval of 
central has elapsed or updates are forced 

这是因为默认的是apache的仓库,但是我们hadoop的版本写的是CDH,这时要将CDH的仓库配进来,打开spark目录下的pom.xml文件,将CDH的仓库配进去。
vi  /usr/local/spark-test/app/spark-2.2.0/pom.xml     添加如下 

<repository>
      <id>cloudera</id>
      <name>cloudera Repository</name>
      <url>https://repository.cloudera.com/artifactory/cloudera-repos</url>
</repository>

【问题2】
 export MAVEN_OPTS="-Xmx2g -XX:ReservedCodeCacheSize=512m -XX:MacPreSize=512M"
 有些同学是阿里云的机器,但是你这机器的内存可能是有限的,建议vm至少2-4G。VM:8G
【问题3】
 如果编译的是scala版本是2.10
 ./dev/change-scala-version.sh 2.10
【问题4】
 was cached in the local repository....
去仓库把 xxx.lastupdated文件全部删除,重新执行maven命令
编译命令后面 -U
【问题5】
[WARNING] 'parent.relativePath' of POM org.apache.spark:spark-parent_2.11:2.2.0 (/software/spark/spark-2.2.0/pom.xml) points at org.apache.spark:spark-parent_2.11 instead of org.apache:apache, please verify your project structure @ org.apache.spark:spark-parent_2.11:2.2.0, /software/spark/spark-2.2.0/pom.xml, line 22, column 11
将jdk替换成1.8
【问题6】
如果编译过程中看不到具体的信息,建议使用-X
./build/mvn -X -Pyarn -Phadoop-2.6 -Phive -Phive-thriftserver -Dhadoop.version=2.6.0-cdh5.7.0 -DskipTests clean package     

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值