diff --git "a/src/content/posts/2024-01/imgs/wyj_17999824_01/Spark\344\276\235\350\265\226\345\233\276.png" "b/src/content/posts/2024-01/imgs/wyj_17999824_01/Spark\344\276\235\350\265\226\345\233\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..702edc18b75ac4cdb3c621878c4f8643da6f987f Binary files /dev/null and "b/src/content/posts/2024-01/imgs/wyj_17999824_01/Spark\344\276\235\350\265\226\345\233\276.png" differ diff --git "a/src/content/posts/2024-01/imgs/wyj_17999824_01/\345\212\237\350\203\275\346\265\213\350\257\225.png" "b/src/content/posts/2024-01/imgs/wyj_17999824_01/\345\212\237\350\203\275\346\265\213\350\257\225.png" new file mode 100644 index 0000000000000000000000000000000000000000..573c426601df8fd24cbfb6e2ffb1e47f7ad62e8a Binary files /dev/null and "b/src/content/posts/2024-01/imgs/wyj_17999824_01/\345\212\237\350\203\275\346\265\213\350\257\225.png" differ diff --git "a/src/content/posts/2024-01/imgs/wyj_17999824_01/\346\200\247\350\203\275\346\265\213\350\257\225.png" "b/src/content/posts/2024-01/imgs/wyj_17999824_01/\346\200\247\350\203\275\346\265\213\350\257\225.png" new file mode 100644 index 0000000000000000000000000000000000000000..0bbb7caf7ccb0c59e7fb174a60149f8f1987074f Binary files /dev/null and "b/src/content/posts/2024-01/imgs/wyj_17999824_01/\346\200\247\350\203\275\346\265\213\350\257\225.png" differ diff --git "a/src/content/posts/2024-01/imgs/wyj_17999824_01/\346\234\200\347\273\210\346\225\210\346\236\234.png" "b/src/content/posts/2024-01/imgs/wyj_17999824_01/\346\234\200\347\273\210\346\225\210\346\236\234.png" new file mode 100644 index 0000000000000000000000000000000000000000..d8abf6b05928364fd1ad82ec0926261792cdfdc3 Binary files /dev/null and "b/src/content/posts/2024-01/imgs/wyj_17999824_01/\346\234\200\347\273\210\346\225\210\346\236\234.png" differ diff --git "a/src/content/posts/2024-01/imgs/wyj_17999824_01/\346\255\243\345\270\270\347\216\260\350\261\241.png" "b/src/content/posts/2024-01/imgs/wyj_17999824_01/\346\255\243\345\270\270\347\216\260\350\261\241.png" new file mode 100644 index 0000000000000000000000000000000000000000..899936fd9acd1af2d63192b1e579c8535cb8ffc8 Binary files /dev/null and "b/src/content/posts/2024-01/imgs/wyj_17999824_01/\346\255\243\345\270\270\347\216\260\350\261\241.png" differ diff --git "a/src/content/posts/2024-01/imgs/wyj_17999824_01/\347\241\256\345\256\236\351\234\200\350\246\201SBT.png" "b/src/content/posts/2024-01/imgs/wyj_17999824_01/\347\241\256\345\256\236\351\234\200\350\246\201SBT.png" new file mode 100644 index 0000000000000000000000000000000000000000..5b3136b16c6adb0e313739c636cff2bbc2a53dc3 Binary files /dev/null and "b/src/content/posts/2024-01/imgs/wyj_17999824_01/\347\241\256\345\256\236\351\234\200\350\246\201SBT.png" differ diff --git "a/src/content/posts/2024-01/imgs/wyj_17999824_01/\347\274\226\350\257\221\350\277\233\345\272\246.png" "b/src/content/posts/2024-01/imgs/wyj_17999824_01/\347\274\226\350\257\221\350\277\233\345\272\246.png" new file mode 100644 index 0000000000000000000000000000000000000000..9bcbce74f57a1c27e78d6b0e1f6406c95e2e9b92 Binary files /dev/null and "b/src/content/posts/2024-01/imgs/wyj_17999824_01/\347\274\226\350\257\221\350\277\233\345\272\246.png" differ diff --git "a/src/content/posts/2024-01/imgs/wyj_17999824_01/\350\204\232\346\234\254\344\270\213\350\275\275Spark-3.5.1-arm-\346\265\213\350\257\225\347\224\250\344\276\213.png" "b/src/content/posts/2024-01/imgs/wyj_17999824_01/\350\204\232\346\234\254\344\270\213\350\275\275Spark-3.5.1-arm-\346\265\213\350\257\225\347\224\250\344\276\213.png" new file mode 100644 index 0000000000000000000000000000000000000000..554ee63d0ef2dad7748ac3a9aea33a12787af9fa Binary files /dev/null and "b/src/content/posts/2024-01/imgs/wyj_17999824_01/\350\204\232\346\234\254\344\270\213\350\275\275Spark-3.5.1-arm-\346\265\213\350\257\225\347\224\250\344\276\213.png" differ diff --git "a/src/content/posts/2024-01/imgs/wyj_17999824_01/\350\204\232\346\234\254\344\270\213\350\275\275Spark-3.5.1-arm.png" "b/src/content/posts/2024-01/imgs/wyj_17999824_01/\350\204\232\346\234\254\344\270\213\350\275\275Spark-3.5.1-arm.png" new file mode 100644 index 0000000000000000000000000000000000000000..33ade0320f1f73c8fee96bdb9cc811f194c2c079 Binary files /dev/null and "b/src/content/posts/2024-01/imgs/wyj_17999824_01/\350\204\232\346\234\254\344\270\213\350\275\275Spark-3.5.1-arm.png" differ diff --git a/src/content/posts/2024-01/wyj_17999824_01.md b/src/content/posts/2024-01/wyj_17999824_01.md new file mode 100644 index 0000000000000000000000000000000000000000..f164121d3e1cfdc739c7251c63eb80007933da62 --- /dev/null +++ b/src/content/posts/2024-01/wyj_17999824_01.md @@ -0,0 +1,441 @@ +--- +title: 大数据组件Spark的测试报告与部署指南 +author: 王翊嘉 +pubDate: 2024-07-18 +categories: ["2024 年第一期"] +description: "对训练营项目期间我做的工作进行概述,并提供一份为后续同学加快工作进展的部署指南。" +--- + +## 目录 + +- [目录](#目录) +- [我的工作](#我的工作) +- [Spark 在 Arm 架构、鲲鹏 920 服务器下的部署](#spark-在-arm-架构鲲鹏-920-服务器下的部署) + - [大体流程 \&\& 目录](#大体流程--目录) + - [源码编译篇](#源码编译篇) + - [准备依赖](#准备依赖) + - [Gcc 工具链 以及 cmake](#gcc-工具链-以及-cmake) + - [OpenJDK](#openjdk) + - [Maven](#maven) + - [Python](#python) + - [Scala](#scala) + - [R](#r) + - [Protoc](#protoc) + - [SBT](#sbt) + - [下载 Spark 源码](#下载-spark-源码) + - [编译 Spark 源码](#编译-spark-源码) + - [解压直装篇](#解压直装篇) + - [下载预编译版本](#下载预编译版本) + - [解压直装](#解压直装) + - [环境配置](#环境配置) + - [编译参数](#编译参数) +- [Spark 的功能测试和性能测试](#spark-的功能测试和性能测试) + - [功能测试](#功能测试) + - [性能测试](#性能测试) + - [自动化脚本](#自动化脚本) + - [总结](#总结) + +## 我的工作 + +- Arm 下的 spark 部署(源码编译版+bin 包直用版)。 +- 在组内同学遇到问题后,接手 Risc-V 下的 spark 部署(源码编译版)。 +- Arm 下的 spark 功能与性能测试。 +- 自动化测试脚本的编写。 + +Risc-V 环境下的配置并没有完成。 + +## Spark 在 Arm 架构、鲲鹏 920 服务器下的部署 + +Spark 的部署大体有两种方式,源码编译和解压直装。 + +- 对于 ARM 架构来说,两种方式都可以。 +- 但对于 Risc-V 架构来说,只能采用源码编译的方式。 + +构建环境,`Spark-2.x` 需要 `maven`,`Spark-3.x` 不仅需要 `maven`,还需要 `SBT`: + +| 名称 | 版本 (Arm) | +| -------- | ---------- | +| gcc | 10.3.0 | +| g++ | 10.3.0 | +| cmake | 3.3.0 | +| python | 3.9.9 | +| java | 1.8.0_412 | +| Scala | 2.10.6 | +| R | 4.2.3 | +| Spark | 3.5.1 | +| protobuf | 3.7.1 | +| maven | 3.6.3-2 | +| SBT | 0.13.1 | + +### 大体流程 && 目录 + +**- [源码编译篇](#源码编译篇)** + +> 1. [准备依赖](#准备依赖) +> 2. [下载 Spark 源码](#下载-Spark-源码) +> 3. [编译 Spark 源码](#编译-spark-源码) + +**- [解压直装篇](#解压直装篇)** + +> 1. [下载预编译版本](#下载预编译版本) +> 2. [解压直装](#解压直装) + +**- [环境配置](#环境配置)** + +**- [编译参数](#编译参数)** + +**- [参考文献](#参考文献)** + +### 源码编译篇 + +#### 准备依赖 + +经过查找相当多的资料,**大致**的依赖情况如下图: +![](./imgs/wyj_17999824_01/Spark依赖图.png) + +所以,需要依次准备相关依赖。经汇总,除了 `R`,其它都支持 `yum` 安装。 + +想要安装这部分依赖,一部分需要使用 `yum`。但有个小问题是,`yum` 不 `sudo` 无法进行,使用 `sudo` 则会默认为全部用户安装。这一点,我能想到的解决方法,貌似仅有通过源码编译来解决。 + +###### Gcc 工具链 以及 cmake + +使用 `yum` 安装。 + +```bash +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` 安装。 + +```bash +sudo yum install java-1.8.0-openjdk + +# 通过下面命令,查看是否安装成功 +java -version +``` + +###### Maven + +使用 `yum` 安装。 + +```bash +sudo yum install maven + +# 通过下面命令,查看是否安装成功 +mvn -v +``` + +###### Python + +使用 `yum` 安装。 + +```bash +sudo yum install python3 + +# 通过下面命令,查看是否安装成功 +python --version +``` + +###### Scala + +使用 `yum` 安装。 + +```bash +sudo yum install scala + +# 通过下面命令,查看是否安装成功 +scala -version +``` + +###### R + +**经过尝试,R 语言无法使用 `yum` 安装,故采用源码安装方式。** + +```bash +# 获取源码包,默认在 ~/ 下 +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 +``` + +然后要配一下环境变量: + +```bash +vi ~/.bash_profile + +# 加入下面 3 行内容: +R_HOME=~/R-4.2.3 +PATH=$R_HOME/bin:$PATH +export R_HOME PATH + +# 按 Esc, 然后输入 “:wq” + +# 使环境变量生效 +source ~/.bash_profile +``` + +最后: + +```bash +# 通过下面命令,查看是否安装成功 +R --version +``` + +###### Protoc + +可以直接使用 yum 安装。 + +```bash +sudo yum install protobuf + +# 通过下面命令,查看是否安装成功 +protoc --version +``` + +###### SBT + +经过尝试,在 Arm 下,可以直接使用 `yum` 进行安装: + +```bash +sudo yum install sbt + +# 验证版本 +sbt sbtVersion +``` + +`Spark-3.x` 极可能需要 `SBT`,在下图最后一行可以明显看到有一个 `.sbt` 文件夹: +![](./imgs/wyj_17999824_01/确实需要SBT.png) + +#### 下载 Spark 源码 + +```bash +# 下载源码 +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: + +```xml +false +``` + +可以用如下流程: + +```bash +vi ./pom.xml + +# 找到 ,将 true 改为 false +# 通过 按 `/useZincServer` 找到对应项,进行修改 +# 按 Esc, 然后输入 “:wq” +``` + +**实际上,刚刚的流程是需要对 `Spark-2.x` 进行的,到了 `Spark-3.x`,已经不再使用 `Zinc` 服务器,所以 `pom.xml` 中不再存在这部分内容。** + +**经查资料,Spark-3.x 使用到 SBT 进行管理。** + +在编译前,还需要进行换源,国外 google 的 maven 拉取太慢,参照官方文档内容,操作如下: + +```bash +# 编辑 pom.xml 文件 +vi ./pom.xml + +# 在标签的第一位添加鲲鹏 Maven 仓库源 + + kunpengmaven + kunpeng maven + https://mirrors.huaweicloud.com/kunpeng/maven + + +# 在标签第一位添加华为 Maven 源。 + + huaweicloud-plugin + https://mirrors.huaweicloud.com/repository/maven + + +# 按 Esc, 然后输入 “:wq” +``` + +**注:如果想要指定无编译优化行为的编译命令,见最后“编译参数”部分。** + +开始编译(仍然位于 spark-3.5.1 目录内): + +```bash +dev/make-distribution.sh --tgz -Pyarn,hive,hive-thriftserver,sparkr +``` + +**注:出现下图,且较长时间不动,是正常现象!(在源码编译 Spark-2.3.1 时,用时很短,没有等太久。但在编译 Spark-3.5.1 时,在这里足足卡了 40min,才继续!)** +![](./imgs/wyj_17999824_01/正常现象.png) + +由于使用 Google 的 `Maven` 仓库,所以下载会很慢,理论上来说,可以通过换其它的 `Maven` 源来解决,但又不确定其他的 `Maven` 源是否具有所需要的内容。所以,编译时要等很长时间,用于服务器下载(可能大约需要 3 到 4 小时左右)。 + +好在,编译中断后,从 `Maven` 下载到的内容不会被删除,所以,可以重新执行编译命令,并且因为下载量的减少,能够更快的进行编译。 + +在命令行里,会时不时出现下图所示内容,框起来的部分,就是组件的编译进度的提示,例,`34/34` 代表,共 `34` 个,正在进行第 `34` 个: + +![](./imgs/wyj_17999824_01/编译进度.png) + +```bash +# 编译结束后,在本目录中出现一个 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 键 +``` + +### 解压直装篇 + +#### 下载预编译版本 + +在[清华镜像站](https://mirrors.tuna.tsinghua.edu.cn/apache/spark/)上,可以看到 Hadoop 和 Spark 的预编译版本。 + +版本选择:3.5.1,且要求带有 Hadoop3。所以,需要下载 `spark-3.5.1-bin-hadoop3.tgz`。服务器上的下载命令如下: + +```bash +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。** + +下载成功结果如下图所示: +![](./imgs/wyj_17999824_01/脚本下载Spark-3.5.1-arm.png) + +#### 解压直装 + +```bash +tar -zxvf spark-3.5.1-bin-hadoop3.tgz +``` + +然后,安装完毕,可以选择进一步配置环境变量。但需要注意的是,如下图所示: + +![](./imgs/wyj_17999824_01/脚本下载Spark-3.5.1-arm-测试用例.png) + +可以看到一些 spark 自带的测试用例,它们分别依赖: + +- java +- python +- r +- scala +- scripts 文件夹内的,是 shell 脚本 + +所以,如果想要运行这些测试用例,需要先保证有这些依赖。解压直装版,就此结束。 + +### 环境配置 + +Spark 运行时的工作目录位于,Spark-xxx-bin-xxx.tgz 压缩包解压后的目录内,第一个 `xxx` 是版本号,第二个 `xxx` 作用未知,疑似代表依赖项数量。 + +因此,需要将环境变量配置为该工作目录。 + +```bash +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 键 +``` + +最终效果,如下图所示: +![](./imgs/wyj_17999824_01/最终效果.png) + +### 编译参数 + +由于某些情况下不能开编译优化,例如我们需要做的性能比较,因为 rv 暂时不支持编译优化,所以需要控制变量,让 Arm 也不启用编译优化。汇总后,得到最终的编译命令如下: + +```bash +mvn clean -DskipTests -Dmaven.compiler.optimize=false +dev/make-distribution.sh --tgz -Pyarn,hive,hive-thriftserver,sparkr +``` + +## Spark 的功能测试和性能测试 + +### 功能测试 + +这段时间内,我主要进行了两个功能的测试,分别是对 Pi.py 的测试和对 Kmeans.py 的测试。对于一般的测试流程,就是先读示例脚本的源代码,掌握其传参内容,然后进行参数传递并验证。 + +具体测试结果,如下图所示: +![](./imgs/wyj_17999824_01/功能测试.png) + +### 性能测试 + +对于性能方面,我做了对于 Pi.py 的测试,Kmeans.py 的测试由于时间不够没有完善好,主要是因为没有为 Kmeans.py 形成更好的脚本,导致在调用性能测试脚本时报错。 +Pi.py 的性能测试结果,并不需要记录于表中,故我给出其命令: + +```bash +performance_counter_920.sh /home/bigdata2/wangyijia/test-shs/test-01/test-01.sh ./ +``` + +其性能测试结果截图如下: +![](./imgs/wyj_17999824_01/性能测试.png) + +### 自动化脚本 + +通过脚本,我实现了非常初步的自动化,以对 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. 对于更多的基础测例,我查看了它们的文档,但并没有了解如何部署并运行这些测试