下载和编译Spark

1. 下载Spark

登陆Spark官网的下载页面可以下载Spark源码或预编译好的包,进入页面后下载有如下5步:

  1. 选择Spark的版本;
  2. 选择包的类型:有源码包,也有预编译的包如Pre-built for CDH4,即运行在CDH4集群上的Spark;
  3. 选择下载的类型:镜像文件或者直接下载文件
  4. 下载链接
  5. 校验和下载

还需注意,如官网的所述

Spark 1.6.1 runs on Java 7+, Python 2.6+ and R 3.1+. For the Scala API, Spark 1.6.1 uses Scala 2.10. You will need to use a compatible Scala version (2.10.x).

即Spark使用的是Scala2.10版本;scala2.11的用户需要下载Spark源码然后用Scala2.11进行编译,编译方法见Building for scala 2.11

也就是说,Spark需要针对特定的运行环境进行编译,比如CDH或Hadoop的版本,Scala的版本等。实际生产环境使用的CDH版本常常没有对应的预编译包,不同的生产环境使用的Hadoop和Hive的版本也不一样,所以需要自行编译,官方只是针对某一部分版本进行了编译。官方指导文档给出了编译Spark的方法。

此处下载Spark源码,接下来对Spark进行编译。

注意:下载后的源文件要修改成普通用户权限,否则会报权限的错误。

下载页面其他信息

在官方的下载页面,还有其他有用的信息

  • Link with Spark 给出了Spark的当前版本在maven仓库中的三元组信息
  • Spark Source Code Management 是关于从github上clone Spark版本分支的方法,也即从github获得源码的方法

2. Spark1.x的三种编译方式

  • SBT编译
    • Simple Build Tool
    • 专门针对Scala的工程项目构建
  • Maven编译
    • 项目管理构建工具
    • Spark是scala语言写的,但是支持maven编译
    • 一定要提前安装maven;一定要保证联网
    • spark源文件中有pom.xml,就是用来maven编译的
  • 打包编译make-distribution.sh
    • 实际上就是maven编译,只不过写成.sh的脚本运行
    • 本文主要介绍这种编译方式
    • spark源文件中有make-distribution.sh

3. 编译官方指导

2.1 编译环境的准备

  1. Linux上安装好JDK
  2. Linux上安装好maven
  3. Linux上安装Scala 2.10

注意官方指导中建议的JDK和maven的版本:

Building Spark using Maven requires Maven 3.3.3 or newer and Java 7+. The Spark build can supply a suitable Maven binary; see below.

scala推荐2.10版本,2.11版本需要自行编译Spark参见官方指导的Building for Scala 2.11

./dev/change-scala-version.sh 2.11
mvn -Pyarn -Phadoop-2.4 -Dscala-2.11 -DskipTests clean package

2.2 maven编译

参见官方指导的building with build/mvn

build/mvn -Pyarn -Phadoop-2.4 -Dhadoop.version=2.4.0 -DskipTests clean package
  • -Pyarn表示支持yarn
  • -Phadoop-2.4 -Dhadoop.version=2.4.0表示hadoop的版本
  • -DskipTests 编译的时候跳过测试
  • clean package 打包

注意在编译的时候,可能会出现out of memory的错误,避免这个错误,需要进行设置,参考Setting up maven’s memory usage 中说明的参数MAVEN_OPTS。

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

即设置maven编译时最多使用的内存堆栈的大小。使用打包编译,就不用设置。

在指定hadoop版本的时候可以参考Specifying the Hadoop Version中的说明,也给了很多实例,例如针对CDH 4.2的编译方法:

mvn -Dhadoop.version=2.0.0-mr1-cdh4.2.0 -Phadoop-1 -DskipTests clean package

是否支持Hive和JDBC的编译方法,参考Building With Hive and JDBC Support,例如

# Apache Hadoop 2.4.X with Hive 13 support
mvn -Pyarn -Phadoop-2.4 -Dhadoop.version=2.4.0 -Phive -Phive-thriftserver -DskipTests clean package

2.3 利用make-distribution.sh编译

打开make-distribution.sh文件查看内容

  • 177行设置了参数MAVEN_OPTS避免内存溢出
  • 182行编译的命令,就是mvn命令
  • 54行开始,是解析参数,这些参数hadoop、yarn、hive过时了,需要设置–name–tgz等参数

    ./make-distribution.sh –name custom-spark –tgz -Psparkr -Phadoop-2.4 -Phive -Phive-thriftserver -Pyarn

在实际生产中,用的多的是CDH的hadoop版本,可以在 http://archive.cloudera.com/cdh5/ 中下载和查到CDH版本,因此可以写成

# cdh和hive都指定版本
./make-distribution.sh --name custom-spark --tgz -Pyarn -Psparkr -Phadoop-2.4 -Dhadoop.version=2.6.0-CDH5.4.0 -Phive-0.13.1 -Phive-thriftserver 

注意:maven编译一定要翻墙,因为需要下载很多依赖包。出现几次错误是正常的。make-distribution.sh运行以后,半天才有反应很迟钝,这是因为make-distribution.sh会去进行很多操作,为了节省时间你可以进行一些修改129-138行注释掉(每一行都注释),这几行是解析spark、hadoop、hive的版本,我们输入命令时加上版本信息就行(草稿)

4.编译spark1.6.1源码包实战

检查编译环境:

[stefan@localhost ~]$ java -version
java version "1.8.0_91"
Java(TM) SE Runtime Environment (build 1.8.0_91-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.91-b14, mixed mode)

[stefan@localhost ~]$ scala -version
Scala code runner version 2.10.6 -- Copyright 2002-2013, LAMP/EPFL

[stefan@localhost ~]$ mvn -v
Apache Maven 3.3.3 (7994120775791599e205a5524ec3e0dfe41d4a06; 2015-04-22T19:57:37+08:00)
Maven home: /opt/apache-maven-3.3.3
Java version: 1.8.0_91, vendor: Oracle Corporation
Java home: /opt/jdk1.8.0_91/jre
Default locale: zh_CN, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-327.el7.x86_64", arch: "amd64", family: "unix"

解压源码包

[stefan@localhost 下载]$ sudo tar -zxvf spark-1.6.1.tgz -C /opt/

最好修改源码包的名字

[stefan@localhost opt]$ sudo mv spark-1.6.1/ spark-1.6.1-scr

进入源码包

[stefan@localhost opt]$ cd spark-1.6.1-scr/
[stefan@localhost spark-1.6.1-scr]$ ls
assembly  CHANGES.txt  data  docs  extraslicenses  NOTICE python sbin   streaming  unsafe
bagel conf dev   ec2   graphx    make-distribution.sh  pom.xml   R  sbttags   yarn
bin   CONTRIBUTING.md  dockerexamples  launcher  mllib project   README.md  scalastyle-config.xml  tools
build core docker-integration-tests  external  LICENSE   network   pylintrc  repl   sqltox.ini

其中,

  • pom.xml用于maven编译
  • make-distribution.sh是用于脚本编译的文件,里面也就是maven编译
  • core、streaming、graphx、mllib可以看作spark的jar包,只要现在编译好了spark,这些类库就直接可以用,不需要另外安装。

编译的时候需要指定参数,参考官方文档给的例子是:

#例子
./make-distribution.sh --name custom-spark --tgz -Psparkr -Phadoop-2.4 -Phive -Phive-thriftserver -Pyarn

其中hadoop在生产环境中一般用CDH的版本,所以我们可以在 http://archive.cloudera.com/cdh5/cdh/5/ 中找到CDH5的各个hadoop版本

我们选择最近的版本hadoop-2.6.0-cdh5.7.0.tar.gz试试,填写的时候只要填2.6.0-cdh5.7.0;

按照官方文档的例子,我们指定的参数为

./make-distribution.sh –tgz -Psparkr -Phadoop-2.6 –Dhadoop.version=2.6.0-cdh5.7.0 -Phive-2.0.0 -Phive-thriftserver -Pyarn

[stefan@localhost spark-1.6.1-scr]$ sudo ./make-distribution.sh –tgz -Psparkr -Phadoop-2.6 –Dhadoop.version=2.6.0-cdh5.7.0 -Phive-2.0.0 -Phive-thriftserver -Pyarn

编译报错

+++ dirname ./make-distribution.sh
++ cd .
++ pwd
+ SPARK_HOME=/opt/spark-1.6.1-scr
+ DISTDIR=/opt/spark-1.6.1-scr/dist
+ SPARK_TACHYON=false
+ TACHYON_VERSION=0.8.2
+ TACHYON_TGZ=tachyon-0.8.2-bin.tar.gz
+ TACHYON_URL=http://tachyon-project.org/downloads/files/0.8.2/tachyon-0.8.2-bin.tar.gz
+ MAKE_TGZ=false
+ NAME=none
+ MVN=/opt/spark-1.6.1-scr/build/mvn
+ ((  7  ))
+ case $1 in
+ MAKE_TGZ=true
+ shift
+ ((  6  ))
+ case $1 in
+ break
+ '[' -z '' ']'
++ command -v rpm
+ '[' /bin/rpm ']'
++ rpm -E %java_home
+ RPM_JAVA_HOME=/usr/lib/jvm/jre
+ '[' /usr/lib/jvm/jre '!=' %java_home ']'
+ JAVA_HOME=/usr/lib/jvm/jre
+ echo 'No JAVA_HOME set, proceeding with '\''/usr/lib/jvm/jre'\'' learned from rpm'
No JAVA_HOME set, proceeding with '/usr/lib/jvm/jre' learned from rpm
+ '[' -z /usr/lib/jvm/jre ']'
++ command -v git
+ '[' /bin/git ']'
++ git rev-parse --short HEAD
++ :
+ GITREV=
+ '[' '!' -z '' ']'
+ unset GITREV
++ command -v /opt/spark-1.6.1-scr/build/mvn
+ '[' '!' /opt/spark-1.6.1-scr/build/mvn ']'
++ /opt/spark-1.6.1-scr/build/mvn help:evaluate -Dexpression=project.version -Psparkr -Phadoop-2.6 --Dhadoop.version=2.6.0-cdh5.7.0 -Phive-2.0.0 -Phive-thriftserver -Pyarn
++ grep -v INFO
++ tail -n 1
+ VERSION=' -X,--debug Produce execution debug output'

以上内容是make-distribution.sh的执行过程,提示No JAVA_HOME set,现在修改make-distribution.sh

[stefan@localhost spark-1.6.1-scr]$ sudo cp make-distribution.sh make-distribution-original.sh


VERSION=1.6.1
SCALA_VERSION=2.10
SPARK_HADOOP_VERSION=2.6.0-cdh5.7.0
SPARK_HIVE=1

#VERSION=$("$MVN" help:evaluate -Dexpression=project.version $@ 2>/dev/null | grep -v "INFO" | tail -n 1)
#SCALA_VERSION=$("$MVN" help:evaluate -Dexpression=scala.binary.version $@ 2>/dev/null\
#| grep -v "INFO"\
#| tail -n 1)
#SPARK_HADOOP_VERSION=$("$MVN" help:evaluate -Dexpression=hadoop.version $@ 2>/dev/null\
#| grep -v "INFO"\
#| tail -n 1)
#SPARK_HIVE=$("$MVN" help:evaluate -Dexpression=project.activeProfiles -pl sql/hive $@ 2>/dev/null\
#| grep -v "INFO"\
#| fgrep --count "<id>hive</id>";\
## Reset exit status to 0, otherwise the script stops here if the last grep finds nothing\
## because we use "set -o pipefail"
#echo -n)

又报错,难道是要卸载openJDK??所以系统要最小化安装,以免卸载不必要的软件

+ /opt/spark-1.6.1-scr/build/mvn clean package -DskipTests -Psparkr -Phadoop-2.6 --Dhadoop.version=2.6.0-cdh5.7.0 -Phive-2.0.0 -Phive-thriftserver -Pyarn
Using `mvn` from path: /opt/spark-1.6.1-scr/build/apache-maven-3.3.3/bin/mvn
which: no javac in (/sbin:/bin:/usr/sbin:/usr/bin)
Warning: JAVA_HOME environment variable is not set.
OpenJDK 64-Bit Server VM warning: ignoring option MaxPermSize=512M; support was removed in 8.0
Unable to parse command line options: Unrecognized option: --Dhadoop.version=2.6.0-cdh5.7.0

解决办法:删除openJDK

[stefan@localhost ~]$ rpm -qa | grep jdk
java-1.7.0-openjdk-1.7.0.91-2.6.2.3.el7.x86_64
java-1.8.0-openjdk-headless-1.8.0.65-3.b17.el7.x86_64
java-1.8.0-openjdk-1.8.0.65-3.b17.el7.x86_64
java-1.7.0-openjdk-headless-1.7.0.91-2.6.2.3.el7.x86_64
[stefan@localhost ~]$ sudo yum remove java

执行完了之后发现openJDK还没删干净

[stefan@localhost spark-1.6.1-scr]$ rpm -qa |grep jdk 
java-1.8.0-openjdk-headless-1.8.0.65-3.b17.el7.x86_64
java-1.7.0-openjdk-headless-1.7.0.91-2.6.2.3.el7.x86_64

发现这两个依赖被libreoffice需要!
[stefan@localhost spark-1.6.1-scr]$ sudo rpm -e java-1.8.0-openjdk-headless-1.8.0.65-3.b17.el7.x86_64 java-1.7.0-openjdk-headless-1.7.0.91-2.6.2.3.el7.x86_64
错误:依赖检测失败:
java-headless >= 1:1.6 被 (已安裝) libreoffice-core-1:4.3.7.2-5.el7.x86_64 需要
libjvm.so()(64bit) 被 (已安裝) libreoffice-ure-1:4.3.7.2-5.el7.x86_64 需要
java-headless >= 1:1.6 被 (已安裝) libreoffice-core-1:4.3.7.2-5.el7.x86_64 需要
libjvm.so()(64bit) 被 (已安裝) libreoffice-ure-1:4.3.7.2-5.el7.x86_64 需要

[stefan@localhost spark-1.6.1-scr]$ /opt/spark-1.6.1-scr/build/apache-maven-3.3.3/bin/mvn -version
Apache Maven 3.3.3 (7994120775791599e205a5524ec3e0dfe41d4a06; 2015-04-22T19:57:37+08:00)
Maven home: /opt/spark-1.6.1-scr/build/apache-maven-3.3.3
Java version: 1.8.0_91, vendor: Oracle Corporation
Java home: /opt/jdk1.8.0_91/jre
Default locale: zh_CN, platform encoding: UTF-8
OS name: “linux”, version: “3.10.0-327.el7.x86_64”, arch: “amd64”, family: “unix”

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器