本教程源于2016年3月出版书籍《Spark原理、机制及应用》 ,在此以知识共享为初衷公开部分内容,如有兴趣,请支持正版书籍。
Spark为使用者提供了大量的工具和脚本文件,使得其部署与开发变得十分方便快捷,本章将会分别从运行(含集群部署)、开发以及源码编译三个角度,来介绍Spark相关环境的具体配置流程。对于初次接触Spark的读者,建议仅需阅读运行环境部署和开发环境部署两节内容,如果后期有源码编译或者源码学习需求,再回头来阅读相关章节。
2.1 Spark运行环境配置
Spark能够运行在Windows或者Unix Like(如 GUN/Linux、OS X等)平台上。一般情况下,Windows仅作为 Spark的开发平台,读者如果希望把 Spark应用于生产环境,尤其是需要部署集群时,更建议选择Linux平台,本章后续所有内容也都基于Linux发行版Ubuntu 14.04 LTS,其他Linux发行版的操作与之类似。
2.1.1 先决条件
Spark使用Scala语言编写,运行在Java虚拟机(JVM)当中,因此需要在系统中安装Java 6或者更高版本,考虑到后期的开发需求,建议读者直接从Oracle官网上(http://www.oracle.com/technetwork/java/javase/downloads/index.html)下载合适的JDK版本安装,并将JAVA_HOME环境变量的值设置为Java的安装目录,PATH环境变量添加Java安装目录下的bin目录。安装完毕之后执行如下命令检查JDK是否已经被正确安装,命令返回结果会因安装JDK版本而异。
$ javac -version
javac 1.7.0_79
如果读者希望能够使用R语言编写Spark程序,那么还需要在本地安装R解释器,在Ubuntu下可以通过执行如下命令安装:
sudo apt-get update && sudo apt-get install r-base
Spark 控制脚本依赖安全外壳协议(Secure Shell,SSH) 来执行对整个集群的操作,如启动、停止整个集群。如搭建集群,需要在主节点上安装好 SSH 客户端,所有节点上安装好 SSH 服务端。Ubuntu 环境下,可以通过以下命令安装 OpenSSH Client和OpenSSH Server(OpenSSH是SSH的一种开源实现)。
$ sudo apt-get update && sudo apt-get install openssh-client openssh-server
2.1.2 下载与运行 Spark
1. 下载Spark安装包
Spark官方(http://spark.apache.org/downloads.html)提供了Spark二进制包和源码的下载,页面如图2-1所示,如无特殊需求,此处建议读者直接下载预先编译好的二进制包。此外,Spark支持读写HDFS中的文件,读者如果希望后期使用HDFS来做数据存储,需要根据Hadoop的版本选择合适的预构建版本,若未能找到对应自己Hadoop版本的Spark安装包,可以考虑自己手动编译源码,本书会在第2.3节中具体介绍 Spark 源码编译的流程。
下载压缩包到本地目录中,执行如下命令进行解压缩,其中1.x.y为Spark版本号,z.w为Hadoop版本号。
tar -zxvf spark-1.x.y-bin-hadoopz.w.tgz
图2-1 Spark下载页面
2. 安装与运行测试应用
进入解压缩得到的Spark安装目录,执行命令“./bin/run-example SparkPi 10”运行Spark提供的Example程序,该程序用于计算π值。执行结果如下图2-2所示,可以看到Spark计算得到的PI值约等于3.139516。
图2-2 Example程序运行结果
运行Example程序时候如果系统报错提示找不到 java 文件,说明JDK未能被正确安装,或者环境变量没有正确配置。
3. 设置环境变量
在使用 Spark之前,建议读者将Spark的bin目录加入到系统PATH环境变量当中,这样以后在执行bin目录下的程序时,可以直接使用程序名,例如“spark-shell”,而无需指定程序的路径,如“./bin/spark-shell”,具体设置步骤如下:
1)以管理员权限编辑文件/etc/profile,在文件尾部加入如下语句,保存并退出。其中/path/to/spark需要替换成用户自己完整的Spark安装路径。
export SPARK_HOME="/path/to/spark/"
export PATH="$SPARK_HOME/bin:$PATH"
2)执行指令“source /etc/profile”,完成后在任意目录下执行命令“spark-shell –help”,若没有提示命令找不到,则说明设置成功。
3. 设置环境变量
在使用 Spark之前,建议读者将Spark的bin目录加入到系统PATH环境变量当中,这样以后在执行bin目录下的程序时,可以直接使用程序名,例如“spark-shell”,而无需指定程序的路径,如“./bin/spark-shell”,具体设置步骤如下:
1)以管理员权限编辑文件/etc/profile,在文件尾部加入如下语句,保存并退出。其中/path/to/spark需要替换成用户自己完整的Spark安装路径。
export SPARK_HOME="/path/to/spark/"
export PATH="$SPARK_HOME/bin:$PATH"
2)执行指令“source /etc/profile”,完成后在任意目录下执行命令“spark-shell –help”,若没有提示命令找不到,则说明设置成功。
2.1.3 使用交互式 Shell
Spark提供了基于Scala、Python以及R语言的三种交互式Shell。执行命令“spark-shell”可启动Spark Scala Shell,其界面如图2-3所示。
图2-3 Spark Scala Shell启动界面
如果启动Shell时系统报错提示“java_home is not set”,说明JAVA_HOME环境变量未被正确配置。
读者可以尝试在Shell中运行一个简单程序,该程序用于输出/etc/passwd这一文件的行数。输入完一行回车就能立即看到执行结果。输出结果可能会因不同的系统环境而异。
>>> val lines = sc.textFile("/etc/passwd")
15/08/05 15:55:14 INFO MemoryStore: ensureFreeSpace(88456) called with curMem=0, maxMem=280248975
// 省略大部分日志输出
15/08/05 15:55:14 INFO SparkContext: Created broadcast 0 from textFile at <console>:21
>>> lines.count
// 省略大部分日志输出
res0 Long = 25
执行命令“pyspark”可启动Spark Python Shell,其界面如图2-4所示。
图2-4 Spark Python Shell启动界面
行数统计程序的Python版本如下:
>>> lines = sc.textFile("/etc/passwd")
15/08/05 15:59:43 INFO MemoryStore: ensureFreeSpace(157248) called with curMem=0, maxMem=280248975
# 省略大部分日志输出
15/08/05 15:59:43 INFO SparkContext: Created broadcast 0 from textFile at NativeMethodAccessorImpl.java:-2
>>> lines.count()
# 省略大部分日志输出
25
执行命令“sparkR”可以启动Spark R Shell,其界面如图2-5所示。
图2-5 Spark R Shell启动界面
行数统计程序的 R 语言版本如下:
> lines <- SparkR:::textFile(sc, "/etc/passwd")
# 15/08/07 13:10:42 INFO MemoryStore: ensureFreeSpace(157288) called with curMem=343050, maxMem=280248975
# 省略大部分日志输出
# 15/08/07 13:10:42 INFO SparkContext: Created broadcast 2 from textFile at NativeMethodAccessorImpl.java:-2</