spark2.3.2源码官方Apache下载地址:
http://spark.apache.org/downloads.html
编译spark源码的官方Apache参考文档
http://spark.apache.org/docs/2.3.2/building-spark.html
编译Spark源码的前置要求(官方Apache编译要求说明):
Maven 3.3.9 or newer Java 8+ Scala Git(后文会通过分析make-distribution.sh脚本,来阐述为何需要安装Git)
本人使用的软件的版本: apache-maven-3.5.4-bin.tar.gz hadoop-2.6.0-cdh5.15.0.tar.gz jdk-8u181-linux-x64.tar.gz scala-2.12.7.tgz
关于maven本地仓库配置的建议(可不配置,默认本地仓库位置在/home/用户名/.m2/repository目录下): maven的setting.xml文件配置 指定本地仓库的位置:
<localRepository>自己指定的本地仓库目录</localRepository>解压Spark源码到~/app/下(由于本人使用的Linux是ubuntu系统版本,以下下所有Linux命令都是ubuntu版本命令,若读者使用CentOS或者其他Linux版本请自行查找相关命令):
kaku@ubuntu:~$ tar -zxvf spark-2.3.2.tgz -C ~/app/Git的安装:
kaku@ubuntu:~$ sudo apt-get install git配置在系统环境变量里(官方建议Maven的内存配置大一点,不然有可能会出现报错):
export MAVEN_OPTS="-Xmx2g -XX:ReservedCodeCacheSize=512m"如果不配置,可能会遇到如下问题:
[INFO] Compiling 203 Scala sources and 9 Java sources to /Users/me/Development/spark/core/target/scala-2.11/classes... [ERROR] Java heap space -> [Help 1]通过观察pom.xml,可以观察到编译Spark的时候,如果不手动指定hadoop与yarn的版本,会默认采用hadoop、yarn的版本
因此,当我们使用官方文档里的命令:
./build/mvn -DskipTests clean package编译时所使用的hadoop版本为2.6.5
官方文档也给出了编译指定hadoop版本为Apache Hadoop 2.6.X和Apache Hadoop 2.7.X and later的命令:
# 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和JDBC的编译命令:
# With Hive 1.2.1 support ./build/mvn -Pyarn -Phive -Phive-thriftserver -DskipTests clean package根据官方文档的命令结合我使用的hadoop版本可以知道编译hadoop-2.6.0-cdh5.15.0的命令:
./build/mvn -Pyarn -Phive -Phive-thriftserver -Phadoop-2.6 -Dhadoop.version=2.6.0-cdh5.15.0 -DskipTests clean package命令简单解释:
./build/mvn -Pyarn 指定支持yarn -Phive -Phive-thriftserver 指定支持Hive和JDBC -Phadoop-2.6 -Dhadoop.version=2.6.0-cdh5.15.0 指定支持hadoop以及设置hadoop的版本 -DskipTests clean package 跳过测试,进行清理打包以上Maven进行Spark 2.3.2源码编译完成,支持hadoop-2.6.0-cdh5.15.0编译,编译结果会得到Spark相应的Maven工程,并不是能直接运行的Spark
官方文档给出了编译一个可以运行的Spark的命令:
./dev/make-distribution.sh --name custom-spark --pip --r --tgz -Psparkr -Phadoop-2.7 -Phive -Phive-thriftserver -Pmesos -Pyarn -Pkubernetes该命令需要用到一个make-distribution.sh文件,文件在spark-2.3.2/dev/make-distribution.sh目录下
分析make-distribution.sh:
[--mvn <mvn-command>]表示可以跟上maven的相关命令: 而-Pyarn -Phive -Phive-thriftserver -Phadoop-2.6 -Dhadoop.version=2.6.0-cdh5.15.0是相应的Maven编译不可直接运行的Spark的命令
发现make-distribution.sh中有需要需要检查使用Git,因此在前文中说在Spark源码编译之前需要安装Git
官方文档提示的Setting up Maven’s Memory Usage中在Spark源码编译之前所需要设置的,在make-distribution.sh的脚本中,已经给出不用自己手动设置了
这里可以发现make-distribution.sh脚本文件已经将maven的命令中的clean package -DskipTests封装到Linux变量$MVN中,即使用make-distribution.sh脚本进行Spark源码编译时命令不用带上clean package -DskipTests了,只需要添加Maven的其他相关参数即可(-Pyarn -Phive -Phive-thriftserver -Phadoop-2.6 -Dhadoop.version=2.6.0-cdh5.15.0)
由于make-distribution.sh脚本执行时会进行检测系统当前Scala、Hadoop、Hive的版本,会浪费很长时间,可选择将其注释掉用下面内容替代(根据自己的版本进行相应改动),如果你时间充足可以不进行修改
VERSION=2.3.2 SCALA_VERSION=2.12.7 SPARK_HADOOP_VERSION=2.6.0-cdh5.15.0 SPARK_HIVE=1根据官方文档使用make-distribution.sh脚本进行Spark源码编译的命令结合我使用的hadoop版本可以知道编译hadoop-2.6.0-cdh5.15.0的命令:
kaku@ubuntu:~/app/spark-2.3.2$ ./dev/make-distribution.sh --name 2.6.0-cdh5.15.0 --tgz -Dhadoop.version=2.6.0-cdh5.15.0 -Phadoop-2.6 -Phive -Phive-thriftserver -Pyarn编译中可能会遇到的问题:
这个问题是因为本人使用的hadoop是cdh版本而且Maven仓库用的不是官方Maven中央仓库是阿里云Maven镜像仓库,而阿里云Maven镜像里hadoop是Apache版本(官方Maven中央仓库里的hadoop也是Apache版本的),所以Maven找不到cdh版的hadoop报错(如果使用的hadoop不是cdh版本是正常的官方Apache版本应该不会出现这样的问题),需要在spark-2.3.2/pom.xml配置文件中repositories标签下加入cdh版的hadoop的一个仓库:
<repository> <id>cloudera</id> <name>cloudera Repository</name> <url>https://repository.cloudera.com/artifactory/cloudera-repos/</url> </repository>既然说到阿里云Maven镜像,那就在提一个建议吧,可以在apache-maven-3.5.4/conf目录下的settings.xml配置文件中mirrors标签下加入阿里云Maven镜像,这样可以提高Maven工程编译的速度,当然这只是建议(如果时间充足可以考虑不添加)
<mirror> <id>nexus-aliyun</id> <mirrorOf>central</mirrorOf> <name>Nexus aliyun</name> <url>http://maven.aliyun.com/nexus/content/groups/public</url> </mirror>使用make-distribution.sh脚本编译一个可以运行的Spark完成:
编译成功后在spark-2.3.2目录下会得到一个压缩包文件spark-2.3.2-bin-2.6.0-cdh5.15.0.tgz
启动运行spark:
解压压缩包文件spark-2.3.2-bin-2.6.0-cdh5.15.0.tgz
kaku@ubuntu:~/app/spark-2.3.2$ tar -zxvf spark-2.3.2-bin-2.6.0-cdh5.15.0.tgz -C ~/app/进入spark-2.3.2-bin-2.6.0-cdh5.15.0/bin目录运行命令(本人使用local模式两个线程启动):
kaku@ubuntu:~/app/spark-2.3.2-bin-2.6.0-cdh5.15.0/bin$ ./spark-shell --master local[2]启动完成: