【版权声明】版权所有,请勿转载!
作者:厦门大学计算机系林子雨副教授
E-mail: ziyulin@xmu.edu.cn
本博客内容与林子雨编著《大数据技术原理与应用(第5版)》(访问教材官网)教材配套。
本指南介绍了Spark4.2.0的安装和使用方法,采用PySpark和Python编程语言。
备注:在安装Spark4.2.0之前,请首先在Ubuntu24.04中安装JDK17和Hadoop3.5.0。
一、Anaconda的安装和使用方法
为什么要安装Anaconda呢?《大数据技术原理与应用(第5版)》中第11章 Spark,是采用PySpark和Python编程语言。Spark要求Python的版本必须是3.11及以上版本,但是,Ubuntu24.04内部自带的Python版本是3.7,不符合Spark的要求,因此,需要额外单独安装3.11版本的Python,这里采用安装Anaconda的方式来安装Python。
Anaconda是基于Python的数据处理和科学计算平台,它内置了Python和许多非常有用的第三方库。安装Anaconda就相当于把Python和一些常用的库(如NumPy、pandas、MatplotLib等)自动安装好了。Linux操作系统中已经默认自带了Python环境,但是,没有关系,我们依然可以同时安装Anaconda,而且安装Anaconda后,也不会影响Linux操作系统已经自带的Python。
由于访问国外Anaconda网站速度较慢,所以我们一般选择国内的镜像网站进行下载,这里可以选择下载Anaconda3-5.3.1-Linux-x86_64.sh。可以到《大数据技术原理与应用(第5版)》教材官网的“下载专区”的“软件”目录下去下载。或者也可以直接点击这里从百度云盘下载软件(提取码:ziyu)。进入百度网盘后,进入“软件”目录,找到Anaconda3-5.3.1-Linux-x86_64.sh文件,下载到本地。
在Linux终端中执行以下命令安装Anaconda。
cd /home/hadoop/Downloads #假设安装文件在这个目录下
sh ./Anaconda3-5.3.1-Linux-x86_64.sh
执行上述命令后,会出现界面(如下图所示),要求阅读许可文件,用户可以按“Enter”键开始阅读许可文件;许可文件比较长,用户可以按空格键向下翻页;当出现“Do you accept the license terms? [yes|no]”时,输入“yes”即可。

当出现设置安装路径提示时(如下图所示),可以自行设置一个路径,也可以选择默认的路径“/home/
hadoop/anaconda3”。如果选择默认路径,则可以直接按“Enter”键。

由于Anaconda是国外软件,后期安装Anaconda其他模块时,都需要访问国外网站下载文件,速度很慢,因此,我们可以选择更改Anaconda的数据源,从而加快访问速度,具体需要执行以下命令新建一个.condarc文件。
vim ~/.condarc
然后在该文件中输入以下内容并保存。
channels:
- conda-forge
- defaults
show_channel_urls: true
channel_alias: https://mirrors.tuna.tsinghua.edu.cn/anaconda
default_channels:
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r
custom_channels:
conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
bioconda: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
menpo: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
simpleitk: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
在Linux终端内执行python命令(见图3-51),可以看到当前的Python版本信息,使用“which python”命令可以查看当前系统默认使用的Python的路径信息。

Python 3.7.0这个版本太低,会与本书后面安装的Spark 4.2.0存在兼容性问题,所以安装结束后,需要额外安装可与Spark 4.2.0兼容的Python 3.11。用户可以在anaconda3目录下执行以下命令安装Python 3.11。
conda activate
conda create -n pyspark python=3.11
上面命令中“pyspark”是我们给这个版本的Python环境起的名字。当安装过程出现“Proceed ([y]/n)?”的询问时,输入“y”即可。
安装Python 3.11结束以后,可以把Python环境切换到PySpark,命令如下。
conda activate pyspark
然后执行以下命令测试是否切换成功。
python
如果切换成功,会显示如下图所示的结果。

执行以下命令退出Python环境。
>>> exit()
执行如下命令退出pyspark环境。
conda deactivate
再次执行如下命令退出base环境。
conda deactivate
二、安装Spark(Local模式)
(一)下载安装文件
Spark和Hadoop都是Apache软件基金会旗下的开源分布式计算平台,因此,我们可以从Spark和Hadoop官网免费获得这些Apache开源社区软件。在大数据技术的基础学习阶段,我们可以直接安装和使用Spark与Hadoop官网提供的开源版本。
登录Linux操作系统(本书统一采用hadoop用户身份登录),打开浏览器,访问Spark官网,下载4.2.0版本的Spark安装文件spark-4.2.0-bin-without-hadoop.tgz,保存在“/home/hadoop/Downloads”目录下。
除了可到Spark官网下载安装文件,还可以直接在本书官方网站“下载专区”下的“软件”目录中下载Spark安装文件spark-4.2.0-bin-without-hadoop.tgz。
下载完安装文件以后,需要对文件进行解压缩。按照Linux操作系统使用的默认规范,用户安装的软件一般存放在“/usr/local/”目录下。请使用hadoop用户身份登录Linux操作系统,使用组合键“Ctrl+Alt+T”打开一个“终端”(也就是一个Linux Shell环境,用户可以在终端窗口里面输入和执行各种Shell命令),执行以下命令。
$ sudo tar -zxf ~/Downloads/spark-4.2.0-bin-without-hadoop.tgz -C /usr/local/
$ cd /usr/local
$ sudo mv ./spark-4.2.0-bin-without-hadoop ./spark
$ sudo chown -R hadoop:hadoop ./spark #hadoop是当前登录Linux操作系统的用户名
经过上述操作以后,Spark就被解压缩到“/usr/local/spark”目录下,这个目录是本书默认的Spark安装目录。
(二)配置相关文件
1.修改spark-env.sh文件
安装文件解压缩以后,还需要修改Spark的配置文件spark-env.sh。首先,可以复制一份由Spark安装文件自带的配置文件模板,命令如如下
$ cd /usr/local/spark
$ cp ./conf/spark-env.sh.template ./conf/spark-env.sh
然后使用Vim编辑器打开spark-env.sh文件进行编辑,在该文件的第1行添加以下配置信息。
export SPARK_DIST_CLASSPATH=$(/usr/local/hadoop/bin/hadoop classpath)
有了上面的配置信息以后,Spark就可以把数据存储到Hadoop分布式文件系统(HDFS)中,也可以从HDFS中读取数据。如果没有配置上面的信息,Spark就只能读写本地数据,无法读写HDFS中的数据。
2.修改.bashrc文件
需要特别强调的是,.bashrc文件中必须包含以下环境变量的设置。
(1)SPARK_HOME:表示Spark安装路径在哪里。
(2)PYSPARK_PYTHON:表示Spark去哪里寻找Python执行器。
(3)JAVA_HOME:告知Spark Java安装在什么位置。
(4)HADOOP_CONF_DIR:告知Spark Hadoop的配置文件在哪里。
(5)HADOOP_HOME:告知Spark Hadoop安装在哪里。
此外,还可以为Spark配置PATH环境变量。
如果已经设置了上面的5个环境变量,则不需要重复添加设置;如果还没有设置,则需要使用Vim编辑器打开.bashrc文件,命令如下。
vim ~/.bashrc
把该文件修改为以下内容。
export JAVA_HOME=/usr/lib/jvm/jdk-17.0.20.1+1
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export HADOOP_HOME=/usr/local/hadoop
export SPARK_HOME=/usr/local/spark
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export PYSPARK_PYTHON=/home/hadoop/anaconda3/envs/pyspark/bin/python
export PATH=$PATH:${JAVA_HOME}/bin:$HADOOP_HOME/bin:$SPARK_HOME/bin
最后,需要在Linux终端中执行以下命令让该环境变量生效。
source ~/.bashrc
此外,还可以对Spark运行过程的日志信息进行设置,只显示错误级别的信息,执行以下命令。
$ cd /usr/local/spark/conf
$ sudo mv log4j2.properties.template log4j.properties
$ vim log4j.properties
打开log4j.properties以后,把rootLogger.level设置为以下形式(文件中的其他内容不要修改)。
rootLogger.level=error
(三)验证Spark是否安装成功
配置完成后就可以直接使用Spark,不需要像Hadoop那样运行启动命令。通过运行Spark自带的实例SparkPi,可以验证Spark是否安装成功,命令如下。
cd /usr/local/spark
./bin/run-example SparkPi
执行时会输出很多屏幕信息,导致难以找到最终的输出结果。为了从大量的输出信息中快速找到想要的执行结果,我们可以使用grep命令对其进行过滤,命令如下。
./bin/run-example SparkPi 2>&1 | grep "Pi is roughly"
上述命令涉及Linux Shell中关于流水线的知识,读者可以查看网络资料学习流水线命令的用法,此处不再赘述。过滤后的运行结果中只会包含π的近似值,类似以下信息。
Pi is roughly 3.14159570797854
三、启动PySpark
在Linux终端中执行pyspark命令,就可以启动进入Python版本的Spark交互式执行环境。在执行pyspark命令时,可以不带任何参数。
cd /usr/local/spark
./bin/pyspark
启动以后会进入PySpark交互式执行环境,如下图所示。

当使用pyspark命令且没有带上任何参数时,默认使用Local[]模式启动以进入PySpark交互式执行环境。
现在,就可以在里面输入Python代码进行调试了。例如,在Python命令提示符“>>>”后面输入一个表达式“82+5”,然后按“Enter”键,就会立即得到结果。
>>> 8*2+5
21
最后,执行以下命令退出PySpark。
>>> exit()
四、使用spark-submit命令提交运行程序
执行“spark-submit--help”命令可以获取完整的选项列表,具体命令如下。
cd /usr/local/spark
./bin/spark-submit --help
运行Spark安装好后自带的样例程序SparkPi,它的功能是计算得到π的近似值(3.1415926)。在Linux Shell中执行以下命令运行SparkPi。
cd /usr/local/spark
bin/spark-submit \
> --master local[*] \
> /usr/local/spark/examples/src/main/python/pi.py 10 2>&1 | grep "Pi is roughly"
五、Spark应用程序
PySpark交互式环境通常用于开发和测试,当要把应用程序部署到企业实际生产环境中时,我们需要编写独立应用程序。这里通过一个简单的应用程序WordCount来演示如何通过Spark API开发一个独立应用程序。
1. 编写程序
使用Python进行Spark编程比使用Java和Scala要简单得多。使用Scala或Java编写Spark程序时,需要使用sbt或者Maven工具进行编译打包。使用Python编写的Spark程序,则不需要编译打包,可以直接执行。
下面打开一个Linux终端,新建一个代码文件“/usr/local/spark/mycode/python/WordCount.py”,具体内容如下。
from pyspark import SparkConf, SparkContext
conf = SparkConf().setMaster("local[*]").setAppName("My App")
sc = SparkContext(conf = conf)
logFile = "file:///usr/local/spark/README.md"
logData = sc.textFile(logFile, 2).cache()
numAs = logData.filter(lambda line: 'a' in line).count()
numBs = logData.filter(lambda line: 'b' in line).count()
print('Lines with a: %s, Lines with b: %s' % (numAs, numBs))
sc.stop()
这段代码的功能是:第1行用于导入相关依赖包(就是前面已经安装好的PySpark类库);第2行和第3行用于生成一个SparkContext对象,该对象是Spark应用程序的入口;第4行设置文件路径,“file:///usr/local/spark/README.md”是一个本地文件,它位于Linux操作系统的本地目录“/usr/local/spark”下;第5行负责读取README.md文件生成RDD;第6行和第7行分别统计RDD元素中包含字母a和字母b的行数;第8行输出统计结果;第9行结束当前SparkContext的服务。在执行这段Python代码之前,我们首先需要使用以下命令安装PySpark类库。
conda activate pyspark
pip install pyspark==4.2.0 -i https://pypi.tuna.tsinghua.edu.cn/simple
安装结束后,执行如下命令运行代码。
cd /usr/local/spark/mycode/python
python WordCount.py
执行上述命令后,可以得到以下结果。
Lines with a: 120, Lines with b: 85
2. 使用spark-submit命令提交运行程序
通过spark-submit命令可以提交应用程序,该命令的语法格式如下。
spark-submit
--master <master-url> #<master-url>的含义与表4-1中的相同
--deploy-mode <deploy-mode> #部署模式
... #其他参数
<application-file> #Python代码文件
[application-arguments] #传递给主类的主方法参数
执行“spark-submit--help”命令可以获取完整的选项列表,具体命令如下。
cd /usr/local/spark
./bin/spark-submit --help
运行Spark安装好后自带的样例程序SparkPi,它的功能是计算得到π的近似值(3.1415926)。在Linux Shell中执行以下命令运行SparkPi。
cd /usr/local/spark
bin/spark-submit \
> --master local[*] \
> /usr/local/spark/examples/src/main/python/pi.py 10 2>&1 | grep "Pi is roughly"
对于前面得到的WordCount.py,我们可以通过spark-submit将其提交到Spark中运行,命令如下。
/usr/local/spark/bin/spark-submit \
> --master local[*] \
> /usr/local/spark/mycode/WordCount.py
执行上述命令后,可以得到以下结果。
Lines with a: 120, Lines with b: 85
