需求
- 由于CDH中内置的Spark的版本较低,无法满足实际生产中的需要,故需要用Spark源码来自行编译出对应的CDH版本
- 以CDH5官方文档为例:
一、源码准备
- Spark源码下载途径:
- 下载好对应版本的源码(.tgz),并在本地解压
二、编译准备
- 进入Spark最新文档:spark.apache.org/docs/latest…
- 找到Building Spark,点击进入:
- 编译要求(最低):
- Apache Maven 3.6.3
- Java 8
- Apache Maven 3.6.3部署
- 配置环境变量:
-
export M2_HOME=/XXXXX/apache-maven-3.6.3 export MAVEN_HOME=/XXXXX/apache-maven-3.6.3 export PATH=${M2_HOME}/bin:$PATH export PATH=${MAVEN_HOME}/bin:$PATH
-
- 配置阿里云源:
vi /XXXXX/apache-maven-3.6.3/conf/settings.xml-
<mirror> <id>alimaven</id> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <mirrorOf>central</mirrorOf> </mirror>
- 配置环境变量:
三、编译解读
- 采用build/mvn方式编译不会产生Spark安装包,我们这里采用Building a Runnable
- 命令格式:(解压后源码主目录)
./dev/make-distribution.sh --name custom-spark --pip --r --tgz -Psparkr -Phive -Phive-thriftserver -Pmesos -Pyarn -Pkubernetes- ./dev/make-distribution.sh:编译使用的命令脚本
- --name:编译生成Spark包的名字
- custom-spark:填CDH中Hadoop对应的版本 e.g. 2.6.4-cdh6.3.0
- --pip:编Python语言(这里删掉)
- --r:编R语言(这里删掉)
- --tgz:生成tar.gz包
- -Psparkr:这里删掉
- -Pmesos:mesos平台(这里删掉)
- -Pkubernetes:kubernetes平台(这里删掉)
- 编译脚本(make-distribution.sh)解读:
- 以下内容注释掉,自行定义,有效缩短编译时间
- 增加内容:
-
# Spark版本号 VERSION=2.4.7 # Scala版本号 SCALA_VERSION=2.12.12 # CDH-Hadoop版本号 SPARK_HADOOP_VERSION=2.6.4-cdh6.3.0 # 支持Hive SPARK_HIVE=1
-
- Spark源码的pom文件默认没有CDH仓库
- 修改主目录下的pom.xml文件:
-
<repository> <id>cloudera</id> <url>https://repository.cloudera.com/artifactory/cloudera-repos</url> </repository>
- 修改主目录下的pom.xml文件:
四、 修改Scala版本(以Scala2.12.0为例)
- 在Spark目录下运行:
./dev/change-scala-version.sh 2.12
- 在命令中添加字段:
-Dscala.version=2.12.0
五、编译命令
- 命令(Spark目录下):
./dev/change-scala-version.sh 2.12./dev/make-distribution.sh --name 2.6.4-cdh6.3.0 --tgz -Phive -Phive-thriftserver -Pyarn -Dscala.version=2.12.0
- 成功结果:
六、排错指南
1. 资源下载镜像问题
- maven配置了阿里云镜像源,但是Spark编辑中还是从默认源下载。
- 修改pom.xml文件中
<repository>和<pluginRepository>标签:-
<id>nexus-aliyun</id> <name>nexus-aliyun</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots>
-
2. 编译到Spark Project Core报错
- 尝试降低Scala版本,然后重新编译