Spark 源码编译

写在前面

生产上的spark一般来说都是需要我们自己手动编译的,编译适合自己公司生产环境上的spark版本。参照官网http://spark.apache.org/docs/latest/building-spark.html

前置:使用Maven构建Spark需要Maven 3.5.4和Java 8.

Spark 源码编译

首先调大CacheSize

vim ~/.bash_profile
export MAVEN_OPTS="-Xmx2g -XX:ReservedCodeCacheSize=512m"
不把参数调大可能会报OOM的错误,如下:
[ERROR] Java heap space -> [Help 1]

方式一:不推荐

Spark 源代码中自带一个maven
./build/mvn -DskipTests clean package
这样编译出来的都是源代码中pom.xml中指定的版本
默认情况编译的是不支持yarn,hive,jdbc…这样就不能使用yarn,访问hive等

方式二:不能得到tgz的包

以上种种原因,我们坑定是需要自己指定hadoop,hive等等的版本
-P 通过-P来指定pom文件中的哪一个profile,是不能乱写的,必须要pom文件中有定义过才行
-Pyarn 让yarn生效
-Phadoop-2.7 指定的hadoop版本是2.7,默认是hadoop2.6
-Dhadoop.version=2.7.3 -D指定具体的小版本

支持yarn,并指定hadoop的版本:

# Apache Hadoop 2.6.X
./build/mvn -Pyarn -DskipTests clean package

# Apache Hadoop 2.7.X and later
./build/mvn -Pyarn -Phadoop-2.7 -Dhadoop.version=2.7.3 -DskipTests clean package

支持hive:

# With Hive 1.2.1 support

./build/mvn -Pyarn -Phive -Phive-thriftserver -DskipTests clean package

我们公司的版本是:
hadoop: hadoop-2.6.0-cdh5.7.0.tar.gz
scala:scala-2.11.8.tgz

直接来到下载的源码根目录,使用自己的maven,执行:

mvn -Pyarn -Phive -Phive-thriftserver -Phadoop-2.6 -Dhadoop.version=2.6.0-cdh5.7.0 -DskipTests clean package

第一次编译会非常慢,会下载非常多的依赖
执行可能会报错: zinc
解决后,再次执行。但是这样的方式是不能得到类似.tar.gz这样的文件的。

方式三:推荐

上产上使用的方式是make-distribution.sh:文件
https://github.com/apache/spark/blob/master/dev/make-distribution.sh
就是封装好了许多maven的参数

–name: 指定打包出来的文件的名称,建议就使用hadoop的版本

源码的根目录执行:

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

直接这样是会很慢的,要想快一点也是可以的
make-distribution.sh
找到源码根目录/dev/make-distribution.sh,
手动指定以下的版本,先注释掉,再贴进去就可以【生产最佳实践】

VERSION=2.4.3
SCALA_VERSION=2.11
SPARK_HADOOP_HOME=2.6.0-cdh5.7.0
SPARK_HIVE=1

保存退出,再次执行上面的编译命令

报错:
Failed to execute goal on project spark_launcher_2.11…

修改 下载源码的pom.xml,/repo 进行搜索

添加cdh的仓库

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

</repositories>

保存退出,再次执行上面的编译命令

名字由来:

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

编译成功,成功文件位置在源代码的根目录下
spark-2.4.3-bin-2.6.0-cdh5.7.0

Spark 安装包目录结构说明:

bin/  存放客户端相关的脚本
conf/ 配置文件
data/ 存放测试数据
examples/ Spark自带的测试用例, 重点
jars/ 存放Spark相应的jar包, 2.x里面是散的
lib/
logs/
python/
sbin/ 存放服务端相关的脚本:启停集群...
work/
yarn/ 存放yarn相关的jar包

几个点:
1.make-distribution.sh 这个shell文件的学习 重点
2.编译过程的最佳实践,手动指定参数
3.编译出来的examples测试用例的学习

很多东西可以借助别人的,github等。对自己的代码也要学会复用,自己的代码总结好。新的项目说不定就能使用上

原文地址:https://www.cnblogs.com/liuge36/p/12614734.html