基于Centos7编译spark指定Hadoop版本

0 摘要

  主要探究了如何对spark源码进行编译,以及普及了一下Maven中的-P,-D的意义以及我在编译过程中遇到的两个坑。为什么需要编译spark源码呢?官网已经提供了预编译的版本了啊,但是如果你对spark源码进行了修改或者spark提供了相对应的hadoop版本不能满足要求,本人编译是因为需要CDH版本的spark,综上所述,最佳实践是对spark源码进行编译。

1 编译前准备

  本次选择的版本是spark2.2.0,需要准备spark2.2.0文档的编译模块(http://spark.apache.org/docs/2.2.0/building-spark.html),Maven3.3.9或者以上版本,JDK8,Spark2.2.0源码(https://archive.apache.org/dist/spark/spark-2.2.0/spark-2.2.0.tgz)。

  通过上述准备你已经正确配置好JDK和Maven3.3.9以上版本,且下载好源码,解压后文件目录如下:

  可以看到是典型的maven结构:

2 编译开始

  如何编译?查看官网文档,按照步骤一步步来

  2.1 设置的Maven内存

  本人最开始在编译的过程中,使用的一款内存为2G的服务器,编译中间就卡死了,建议:内存一定要大,否则编译不成功,通过下面设置Mavne的内存

export MAVEN_OPTS="-Xmx2g -XX:ReservedCodeCacheSize=512m"

  2.2 编译参数选择

  如果弄懂了下列的参数,那么编译就简单了,本节,你会知道Maven中编译的一些知识。

    下图是官网提供的一个脚本make-distribution.sh,可以编译成一个可分发的包,便于部署,我们使用这个来部署。

  2.2.1 Maven编译相关

上图中的-Phadoop-2.7,-Phive什么意思?

在Maven中,profile可以让我们定义一系列的配置信息,然后指定其激活条件。这样我们就可以定义多个profile,然后每个profile对应不同的激活条件和配置信息,从而达到不同环境使用不同配置信息的效果。比如说,我们可以通过profile定义在jdk1.5以上使用一套配置信息,在jdk1.5以下使用另外一套配置信息;或者有时候我们可以通过操作系统的不同来使用不同的配置信息,比如windows下是一套信息,linux下又是另外一套信息,等等。下图是一个id为:hadoop-2.7的一个profile,

所以,简而言之,可以通过-P+$(profile_id)来显示的指定你需要的profile,本次编译需要hive,hive-thriftserver,yarn等Profile,所在需要指定为:-Phive -Phive-thriftserver -Pyarn

上图中的-D是什么意思?

这是显示的指定的属性值,本次使用的Hadoop版本是:2.6.0-cdh5.7.0,所以通过-Dhadoop.version=2.6.0-cdh5.7.0指定Hadoop版本

2.3 编译指令

最终编译指定为:指定了需要hive,hive-thriftserver,yarn等Profile,指定了Hadoop版本:2.6.0-cdh5.7.0

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

2.4 在源码根目录 下

执行上面的指令

 2.5 编译成功

3  编译过程中的坑以及解决办法

3.1 错误了通过-Phadoop-2.6多余指定了Hadoop这个Profile(本人后面指定的Hadoop版本就是2.6,且这个版本在Spark2.2.0是默认的Hadoop版本,不需要显示指定)会出现如下错误:提示hadoop-2.6这个Profile不存在,但是实际编译过程中,并不会让你出现错误。仍然会编译完成,但是编译后的包是不能用的。

3.2 找不到某个包,很普遍的错误,因为Maven仓库中的确没有这个包。如下:

解决办法:在spark.2.2.0中的pom.xml文件中如下仓库地址:

4 小结

  熟悉Maven和一定要看官网,官网什么都是详细的。

02-12 21:30