写在前面
生产上的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等。对自己的代码也要学会复用,自己的代码总结好。新的项目说不定就能使用上