训练营学员

傲来操作系统训练营报告

大数据组件Spark的测试报告与部署指南

王翊嘉 发布于 # 2024 年第一期

目录

我的工作

  • Arm 下的 spark 部署(源码编译版+bin 包直用版)。
  • 在组内同学遇到问题后,接手 Risc-V 下的 spark 部署(源码编译版)。
  • Arm 下的 spark 功能与性能测试。
  • 自动化测试脚本的编写。

Risc-V 环境下的配置并没有完成。

Spark 在 Arm 架构、鲲鹏 920 服务器下的部署

Spark 的部署大体有两种方式,源码编译和解压直装。

  • 对于 ARM 架构来说,两种方式都可以。
  • 但对于 Risc-V 架构来说,只能采用源码编译的方式。

构建环境,Spark-2.x 需要 mavenSpark-3.x 不仅需要 maven,还需要 SBT

名称版本 (Arm)
gcc10.3.0
g++10.3.0
cmake3.3.0
python3.9.9
java1.8.0_412
Scala2.10.6
R4.2.3
Spark3.5.1
protobuf3.7.1
maven3.6.3-2
SBT0.13.1

大体流程 && 目录

- 源码编译篇

  1. 准备依赖
  2. 下载 Spark 源码
  3. 编译 Spark 源码

- 解压直装篇

  1. 下载预编译版本
  2. 解压直装

- 环境配置

- 编译参数

- 参考文献

源码编译篇

准备依赖

经过查找相当多的资料,大致的依赖情况如下图:

所以,需要依次准备相关依赖。经汇总,除了 R,其它都支持 yum 安装。

想要安装这部分依赖,一部分需要使用 yum。但有个小问题是,yumsudo 无法进行,使用 sudo 则会默认为全部用户安装。这一点,我能想到的解决方法,貌似仅有通过源码编译来解决。

Gcc 工具链 以及 cmake

使用 yum 安装。

sudo yum install gcc gcc-c++ gcc-gfortran libgcc

sudo yum install openssl-devel zlib-devel automake libtool cmake

# 安装完成后,可以通过以下命令查看是否安装成功
gcc --version
cmake --version

注:一般 yum 前不加上 sudo,都会执行不了。

OpenJDK

使用 yum 安装。

sudo yum install java-1.8.0-openjdk

# 通过下面命令,查看是否安装成功
java -version
Maven

使用 yum 安装。

sudo yum install maven

# 通过下面命令,查看是否安装成功
mvn -v
Python

使用 yum 安装。

sudo yum install python3

# 通过下面命令,查看是否安装成功
python --version
Scala

使用 yum 安装。

sudo yum install scala

# 通过下面命令,查看是否安装成功
scala -version
R

经过尝试,R 语言无法使用 yum 安装,故采用源码安装方式。

# 获取源码包,默认在 ~/ 下
wget https://mirrors.ustc.edu.cn/CRAN/src/base/R-4/R-4.2.3.tar.gz

# 解压
tar -zxvf R-4.2.3.tar.gz

# 进入目录
cd R-4.2.3

# 编译,可以修改用户名参数,来为当前用户安装
./configure --prefix=/home/wangyijia/R-4.2.3 --enable-R-shlib --enable-BLAS-shlib --with-blas --with-lapack

# 查询核数
nproc

# 指定4核编译
make -j4
# 编译
make install

然后要配一下环境变量:

vi ~/.bash_profile

# 加入下面 3 行内容:
R_HOME=~/R-4.2.3
PATH=$R_HOME/bin:$PATH
export R_HOME PATH

# 按 Esc, 然后输入 “:wq”

# 使环境变量生效
source ~/.bash_profile

最后:

# 通过下面命令,查看是否安装成功
R --version
Protoc

可以直接使用 yum 安装。

sudo yum install protobuf

# 通过下面命令,查看是否安装成功
protoc --version
SBT

经过尝试,在 Arm 下,可以直接使用 yum 进行安装:

sudo yum install sbt

# 验证版本
sbt sbtVersion

Spark-3.x 极可能需要 SBT,在下图最后一行可以明显看到有一个 .sbt 文件夹:

下载 Spark 源码

# 下载源码
wget https://github.com/apache/spark/archive/v3.5.1.tar.gz
# 解压
tar -zxvf v3.5.1.tar.gz
# 切换目录
cd spark-3.5.1

编译 Spark 源码

注:按现有的官方教程来,要安装 Spark-2.x 的版本时,走如下修改 pom.xml 流程。而安装 Spark-3.x 时,经尝试,直接准备 SBT 即可。

先修改 pom.xml,将 true 改为 false:

<useZincServer>false</useZincServer>

可以用如下流程:

vi ./pom.xml

# 找到 <useZincServer>,将 true 改为 false
# 通过 按 `/useZincServer` 找到对应项,进行修改
# 按 Esc, 然后输入 “:wq”

实际上,刚刚的流程是需要对 Spark-2.x 进行的,到了 Spark-3.x,已经不再使用 Zinc 服务器,所以 pom.xml 中不再存在这部分内容。

经查资料,Spark-3.x 使用到 SBT 进行管理。

在编译前,还需要进行换源,国外 google 的 maven 拉取太慢,参照官方文档内容,操作如下:

# 编辑 pom.xml 文件
vi ./pom.xml

# 在<repositories>标签的第一位添加鲲鹏 Maven 仓库源
<repository>
    <id>kunpengmaven</id>
    <name>kunpeng maven</name>
    <url>https://mirrors.huaweicloud.com/kunpeng/maven</url>
</repository>

# 在<pluginRepository>标签第一位添加华为 Maven 源。
<pluginRepository>
    <id>huaweicloud-plugin</id>
    <url>https://mirrors.huaweicloud.com/repository/maven</url>
</pluginRepository>

# 按 Esc, 然后输入 “:wq”

注:如果想要指定无编译优化行为的编译命令,见最后“编译参数”部分。

开始编译(仍然位于 spark-3.5.1 目录内):

dev/make-distribution.sh --tgz -Pyarn,hive,hive-thriftserver,sparkr

注:出现下图,且较长时间不动,是正常现象!(在源码编译 Spark-2.3.1 时,用时很短,没有等太久。但在编译 Spark-3.5.1 时,在这里足足卡了 40min,才继续!)

由于使用 Google 的 Maven 仓库,所以下载会很慢,理论上来说,可以通过换其它的 Maven 源来解决,但又不确定其他的 Maven 源是否具有所需要的内容。所以,编译时要等很长时间,用于服务器下载(可能大约需要 3 到 4 小时左右)。

好在,编译中断后,从 Maven 下载到的内容不会被删除,所以,可以重新执行编译命令,并且因为下载量的减少,能够更快的进行编译。

在命令行里,会时不时出现下图所示内容,框起来的部分,就是组件的编译进度的提示,例,34/34 代表,共 34 个,正在进行第 34 个:

# 编译结束后,在本目录中出现一个 spark-3.5.1-bin-xxxx.tgz 文件,这就是编译好的 Spark-3.5.1
# 在我的编译进行过程中,该文件名为: spark-3.5.1-bin-3.3.4.tgz

# 可选进行移动,且切换目录
mv spark-3.5.1-bin-3.3.4.tgz ~/ && cd ~/

# 解压
tar -zxvf spark-3.5.1-bin-3.3.4.tgz

# 验证安装完毕
cd spark-3.5.1-bin-3.3.4
spark-shell master local[2]
# 在命令行看到 Spark 的字样,即可退出
# 输入 :q , 按下 Enter 键

解压直装篇

下载预编译版本

清华镜像站上,可以看到 Hadoop 和 Spark 的预编译版本。

版本选择:3.5.1,且要求带有 Hadoop3。所以,需要下载 spark-3.5.1-bin-hadoop3.tgz。服务器上的下载命令如下:

wget https://mirrors.tuna.tsinghua.edu.cn/apache/spark/spark-3.5.1/spark-3.5.1-bin-hadoop3.tgz

注:如果将上面这条命令,和下面的解压命令封装为一个.sh 文件,则实现了“脚本下载”Spark-3.5.1。

下载成功结果如下图所示:

解压直装

tar -zxvf spark-3.5.1-bin-hadoop3.tgz

然后,安装完毕,可以选择进一步配置环境变量。但需要注意的是,如下图所示:

可以看到一些 spark 自带的测试用例,它们分别依赖:

  • java
  • python
  • r
  • scala
  • scripts 文件夹内的,是 shell 脚本

所以,如果想要运行这些测试用例,需要先保证有这些依赖。解压直装版,就此结束。

环境配置

Spark 运行时的工作目录位于,Spark-xxx-bin-xxx.tgz 压缩包解压后的目录内,第一个 xxx 是版本号,第二个 xxx 作用未知,疑似代表依赖项数量。

因此,需要将环境变量配置为该工作目录。

vi ~/.bash_profile

# 以我编译出的 spark-3.5.1-bin-3.3.4 为例,添加如下内容
export SPARK_HOME=~/spark-3.5.1-bin-3.3.4
export PATH=$SPARK_HOME/bin:$PATH

# 保存退出

# 使配置生效
source ~/.bash_profile

# 验证环境
# 切换到非 Spark 工作目录的其它目录内
cd ~
spark-shell master local[2]

# 预期看到 Spark 的字样,即可退出
# 输入 :q , 按下 Enter 键

最终效果,如下图所示:

编译参数

由于某些情况下不能开编译优化,例如我们需要做的性能比较,因为 rv 暂时不支持编译优化,所以需要控制变量,让 Arm 也不启用编译优化。汇总后,得到最终的编译命令如下:

mvn clean -DskipTests -Dmaven.compiler.optimize=false
dev/make-distribution.sh --tgz -Pyarn,hive,hive-thriftserver,sparkr

Spark 的功能测试和性能测试

功能测试

这段时间内,我主要进行了两个功能的测试,分别是对 Pi.py 的测试和对 Kmeans.py 的测试。对于一般的测试流程,就是先读示例脚本的源代码,掌握其传参内容,然后进行参数传递并验证。

具体测试结果,如下图所示:

性能测试

对于性能方面,我做了对于 Pi.py 的测试,Kmeans.py 的测试由于时间不够没有完善好,主要是因为没有为 Kmeans.py 形成更好的脚本,导致在调用性能测试脚本时报错。 Pi.py 的性能测试结果,并不需要记录于表中,故我给出其命令:

performance_counter_920.sh /home/bigdata2/wangyijia/test-shs/test-01/test-01.sh ./

其性能测试结果截图如下:

自动化脚本

通过脚本,我实现了非常初步的自动化,以对 Pi.py 的测试为例,现在可以直接执行 test-01.sh,即可完成对 Pi.py 的功能测试。同时,如果应用提供的 performance_counter_920.sh,则能够进行性能上的测试。

但对于 Kmeans.py,其脚本暂未完成。主要原因是测试结果相差较大。运行完我的测试脚本后,会在当前目录获得四个测试用例,预期每个测试用例,最终能够聚出的类的个数,分别为 3,2,3,4;点的维数分别为 2,2,3,4;测试用例分别命名为:tc-1.txt、tc-2.txt、tc-3.txt、tc-4.txt ;为每个测试用例准备的标准答案,分别保存至 ans-1.txt、ans-2.txt、ans-3.txt、ans-4.txt。 3.2 结果分析

在以 tc-1.txt 作为测试用例时,生成的结果与 ans-1.txt 内的结果,有两个相差极大,有一个几乎相等。

总结

通过本次项目,我掌握了 spark 的一般部署流程,深入了解了 spark 与 spark 的依赖情况。同时,由于服务器是全新的,所以我也深入掌握了“环境”的配置与 vim 的使用(之前我用 nano+vscode)。

但在项目过程中,我也存在一系列不足:

  1. 因为时间较短,我并没有太多的产出
  2. 在组员遇到 risc-v 下面的问题时,我接手了他的工作,但没有改好
  3. 对于更多的基础测例,我查看了它们的文档,但并没有了解如何部署并运行这些测试