diff --git "a/src/content/posts/2024-01/imgs/wyj_17999824_02/Spark\347\274\226\350\257\221\346\212\245\351\224\231.png" "b/src/content/posts/2024-01/imgs/wyj_17999824_02/Spark\347\274\226\350\257\221\346\212\245\351\224\231.png"
new file mode 100644
index 0000000000000000000000000000000000000000..7e99dd04808cf6c80268d95eb115d8e24977aa4d
Binary files /dev/null and "b/src/content/posts/2024-01/imgs/wyj_17999824_02/Spark\347\274\226\350\257\221\346\212\245\351\224\231.png" differ
diff --git "a/src/content/posts/2024-01/imgs/wyj_17999824_02/check\344\277\256\346\224\2711.png" "b/src/content/posts/2024-01/imgs/wyj_17999824_02/check\344\277\256\346\224\2711.png"
new file mode 100644
index 0000000000000000000000000000000000000000..afd5085e1a316eb4da02a7fce091d7e6f2b46ba0
Binary files /dev/null and "b/src/content/posts/2024-01/imgs/wyj_17999824_02/check\344\277\256\346\224\2711.png" differ
diff --git "a/src/content/posts/2024-01/imgs/wyj_17999824_02/check\344\277\256\346\224\2712.png" "b/src/content/posts/2024-01/imgs/wyj_17999824_02/check\344\277\256\346\224\2712.png"
new file mode 100644
index 0000000000000000000000000000000000000000..eafd3b9132ec4fc3ea14aad50c0e04e5dc9c53af
Binary files /dev/null and "b/src/content/posts/2024-01/imgs/wyj_17999824_02/check\344\277\256\346\224\2712.png" differ
diff --git "a/src/content/posts/2024-01/imgs/wyj_17999824_02/compiler\344\277\256\346\224\2711.png" "b/src/content/posts/2024-01/imgs/wyj_17999824_02/compiler\344\277\256\346\224\2711.png"
new file mode 100644
index 0000000000000000000000000000000000000000..fade690db880488cb1d5a901897c412464672b1b
Binary files /dev/null and "b/src/content/posts/2024-01/imgs/wyj_17999824_02/compiler\344\277\256\346\224\2711.png" differ
diff --git "a/src/content/posts/2024-01/imgs/wyj_17999824_02/compiler\344\277\256\346\224\2712.png" "b/src/content/posts/2024-01/imgs/wyj_17999824_02/compiler\344\277\256\346\224\2712.png"
new file mode 100644
index 0000000000000000000000000000000000000000..e2b5cf39a7e416720c8f84d95a7d985d948c836e
Binary files /dev/null and "b/src/content/posts/2024-01/imgs/wyj_17999824_02/compiler\344\277\256\346\224\2712.png" differ
diff --git "a/src/content/posts/2024-01/imgs/wyj_17999824_02/compiler\344\277\256\346\224\2713.png" "b/src/content/posts/2024-01/imgs/wyj_17999824_02/compiler\344\277\256\346\224\2713.png"
new file mode 100644
index 0000000000000000000000000000000000000000..0b824ac7de0558ae45063d2236ae1990c28826cd
Binary files /dev/null and "b/src/content/posts/2024-01/imgs/wyj_17999824_02/compiler\344\277\256\346\224\2713.png" differ
diff --git "a/src/content/posts/2024-01/imgs/wyj_17999824_02/depend\344\277\256\346\224\2712.png" "b/src/content/posts/2024-01/imgs/wyj_17999824_02/depend\344\277\256\346\224\2712.png"
new file mode 100644
index 0000000000000000000000000000000000000000..f26ceb8588bdebc0298770f3934514280ccb1b72
Binary files /dev/null and "b/src/content/posts/2024-01/imgs/wyj_17999824_02/depend\344\277\256\346\224\2712.png" differ
diff --git "a/src/content/posts/2024-01/imgs/wyj_17999824_02/depend\344\277\256\346\224\2713.png" "b/src/content/posts/2024-01/imgs/wyj_17999824_02/depend\344\277\256\346\224\2713.png"
new file mode 100644
index 0000000000000000000000000000000000000000..de34e575e25a82dcf5cf704d4ef620cee915a20b
Binary files /dev/null and "b/src/content/posts/2024-01/imgs/wyj_17999824_02/depend\344\277\256\346\224\2713.png" differ
diff --git a/src/content/posts/2024-01/imgs/wyj_17999824_02/issue.png b/src/content/posts/2024-01/imgs/wyj_17999824_02/issue.png
new file mode 100644
index 0000000000000000000000000000000000000000..13af0bd60f36f991f917bfbeaea5710b0029dc01
Binary files /dev/null and b/src/content/posts/2024-01/imgs/wyj_17999824_02/issue.png differ
diff --git "a/src/content/posts/2024-01/imgs/wyj_17999824_02/linux-architects\344\277\256\346\224\271.png" "b/src/content/posts/2024-01/imgs/wyj_17999824_02/linux-architects\344\277\256\346\224\271.png"
new file mode 100644
index 0000000000000000000000000000000000000000..39ab95c8629cea779756f6f53b5fb93d74b52fc8
Binary files /dev/null and "b/src/content/posts/2024-01/imgs/wyj_17999824_02/linux-architects\344\277\256\346\224\271.png" differ
diff --git "a/src/content/posts/2024-01/imgs/wyj_17999824_02/unix\344\277\256\346\224\2711.png" "b/src/content/posts/2024-01/imgs/wyj_17999824_02/unix\344\277\256\346\224\2711.png"
new file mode 100644
index 0000000000000000000000000000000000000000..5b77e349b810431d6673bee5757badcbb7044d56
Binary files /dev/null and "b/src/content/posts/2024-01/imgs/wyj_17999824_02/unix\344\277\256\346\224\2711.png" differ
diff --git "a/src/content/posts/2024-01/imgs/wyj_17999824_02/unix\344\277\256\346\224\2712.png" "b/src/content/posts/2024-01/imgs/wyj_17999824_02/unix\344\277\256\346\224\2712.png"
new file mode 100644
index 0000000000000000000000000000000000000000..6dc825de5c65fe84ef4be0ab063515cba2ba27f7
Binary files /dev/null and "b/src/content/posts/2024-01/imgs/wyj_17999824_02/unix\344\277\256\346\224\2712.png" differ
diff --git "a/src/content/posts/2024-01/imgs/wyj_17999824_02/upload\344\277\256\346\224\271.png" "b/src/content/posts/2024-01/imgs/wyj_17999824_02/upload\344\277\256\346\224\271.png"
new file mode 100644
index 0000000000000000000000000000000000000000..1d179b2ee2ea98b86f20b3715eb13e78da5e22cc
Binary files /dev/null and "b/src/content/posts/2024-01/imgs/wyj_17999824_02/upload\344\277\256\346\224\271.png" differ
diff --git "a/src/content/posts/2024-01/imgs/wyj_17999824_02/\345\220\216\345\220\221\345\205\274\345\256\271.png" "b/src/content/posts/2024-01/imgs/wyj_17999824_02/\345\220\216\345\220\221\345\205\274\345\256\271.png"
new file mode 100644
index 0000000000000000000000000000000000000000..cd5f072684af267da658d71ddc00c22a609e98a9
Binary files /dev/null and "b/src/content/posts/2024-01/imgs/wyj_17999824_02/\345\220\216\345\220\221\345\205\274\345\256\271.png" differ
diff --git "a/src/content/posts/2024-01/imgs/wyj_17999824_02/\347\211\210\346\234\254\350\257\264\346\230\216.png" "b/src/content/posts/2024-01/imgs/wyj_17999824_02/\347\211\210\346\234\254\350\257\264\346\230\216.png"
new file mode 100644
index 0000000000000000000000000000000000000000..428993c6527f099d079cc0b579a0719b06761dde
Binary files /dev/null and "b/src/content/posts/2024-01/imgs/wyj_17999824_02/\347\211\210\346\234\254\350\257\264\346\230\216.png" differ
diff --git a/src/content/posts/2024-01/wyj_17999824_02.md b/src/content/posts/2024-01/wyj_17999824_02.md
new file mode 100644
index 0000000000000000000000000000000000000000..5c7a5cbff533b49b82d99f4c96cc980eabfe4674
--- /dev/null
+++ b/src/content/posts/2024-01/wyj_17999824_02.md
@@ -0,0 +1,556 @@
+---
+title: RV 下的 spark(v3.5.1) 编译指南
+author: 王翊嘉
+pubDate: 2024-09-06
+categories: ["2024 年第一期"]
+description: "对训练营后的实习期间我做的工作进行概述,并提供一份为后续同学加快工作进展的部署指南。"
+---
+
+## 前言
+
+本教程是我在参加`第一期傲来操作系统训练营`后,在中国科学院软件研究所实习期间产出,如果用此教程进行`转载 / 二创`,请标明原文链接,原文仅发布在 3 个位置:`src-openeuler社区`,`傲来操作系统训练营报告网站`,`华为云社区`。
+
+## 倒数第二层依赖
+
+1. 准备 R 语言,源码编译即可,注意要下载依赖,已经形成 shell 脚本,见提供的 `deploy-R.sh`。对于博客内,则请看我之前写的一篇文章[《大数据组件 Spark 在鲲鹏 920 服务器上的部署指南》](https://www.hikunpeng.com/forum/thread-0219157256904030056-1-1.html),这篇文章内有对 R 语言源码编译的教学。
+2. 配置本机 java 版本,命令:`sudo update-alternatives --config java`,核心在于,要有 `javac` 的可执行文件。对于 `jdk-1.8` 来说,如果发现没有 `javac`,则可以通过 `sudo yum install java-1.8.0-openjdk-devel.riscv64` 安装这个依赖来尝试安装 `javac` 的可执行责任。
+
+指导我的宫小飞老师告诉我,高版本 jdk 对 riscv 架构做出了加速支持,所以理论上来说高版本 jdk 的编译速度能够得到极大加速。经过测试,jdk1.8 和 jdk17 的编译速度相差极大,甚至能差出 5 到 10 倍左右。故以下将会展示,如何将本计算机上的默认 jdk 版本切换至 jdk17,并且 spark 的编译也在 jdk17 的环境下进行。
+
+修改是否完成,可以通过 `javac -version` 命令,打印 javac 的版本来确认。
+
+【后续】我整理了一下需要的脚本,组件脚本,都放在:[https://gitee.com/wang-yijia_DB/protobuf-on-riscv64](https://gitee.com/wang-yijia_DB/protobuf-on-riscv64)
+
+## 最底层依赖
+
+1. 准备一份对应版本的 protoc
+2. 准备一份对应版本的 protoc-jar
+3. 准备对应 protobuf 的 grpc-java
+4. 在 `pom.xml` 中,修改内容,大体要改:
+ 1. os-maven-plugin 的版本
+ 2. maven 的版本
+ 3. scala-parrell 的版本
+ 4. jdk 的版本 -> java.version & jvm
+ 5. protobuf 的版本
+ 6. protobuf-java 的版本
+ 7. 换源
+
+## 0. 下载源码
+
+```bash
+# 下载源码
+wget https://github.com/apache/spark/archive/refs/tags/v3.5.1.tar.gz
+# 解压
+tar -zxf v3.5.1.tar.gz
+# 切换目录,解压后就叫这个名字
+cd spark-3.5.1
+```
+
+## 1. 准备对应版本的 protoc
+
+### i. 源码编译依赖 abseil
+
+`protobuf` 是谷歌的一个序列化结构转换器,`protoc` 是它的编译器。其依赖中,有 `abseil`。
+
+```bash
+sudo yum install g++ bazel
+
+cd ~
+wget -c https://github.com/abseil/abseil-cpp/archive/refs/tags/20240116.2.tar.gz
+tar -zxf 20240116.2.tar.gz
+rm -rf 20240116.2.tar.gz
+mv ./abseil-cpp-20240116.2/ ./abseil-cpp
+cd abseil-cpp/
+# 用 cmake 指定 cpp 标准,要根据服务器里的 gcc 版本来确定是否支持
+# 在我的尝试中,如果采用 cmake 的传统编译流程,即新建 build 文件夹
+# 编译的成果好像无法自动同步到系统环境变量,故我没有新建 build 文件夹
+# 同理,也没有指定编译成果的位置
+cmake ./ -DCMAKE_CXX_STANDARD=20
+# 标准至少 14
+make && make install
+# 注:可以自行指定是否增加 -j 参数指定核数
+# 例:make -j 4
+# 4核编译,-j后面的空格可有可无
+```
+
+### ii. 下载源码
+
+```bash
+# 拉取源码
+wget -c https://github.com/protocolbuffers/protobuf/archive/refs/tags/v3.25.4.tar.gz
+tar -zxf v3.25.4.tar.gz
+# 切换目录
+cd protobuf-3.25.4
+```
+
+### iii. 编译 + 安装
+
+```bash
+# 位于 protobuf-3.25.4 目录下
+
+# 用 cmake 编译
+# 先把安装好的 abseil 加入工作目录
+cp -r ~/abseil-cpp ./third_party
+cmake ./ -DCMAKE_BUILD_TYPE=RELEASE -Dprotobuf_BUILD_TESTS=off -DCMAKE_CXX_STANDARD=20
+sudo make install -j 96
+
+# 注:在执行下面的 install 前,请先确定你编译出的 protoc 的名字
+# 通过:ls /usr/local/bin
+# 查看里面的 protoc 的可执行文件名称,确定其为 `protoc`
+# 直接编译出来的版本,可能会带有版本号,记得删掉,
+# 或在 mvn install 时正确指定
+
+export PROTOC_VERSION="3.25.4"
+mvn install:install-file -DgroupId=com.google.protobuf -DartifactId=protoc -Dversion=${PROTOC_VERSION} -Dclassifier=linux-riscv64 -Dpackaging=exe -Dfile=/usr/local/bin/protoc
+```
+
+**注:再次提醒,记得确保 `/usr/local/bin` 内,有名字为 `protoc` 的可执行文件,且直接使用 `protoc --version` 或者 `/usr/local/bin/protoc --version`,得到的结果都是:`libprotoc 25.4`!**
+
+### iv. 版本选择说明
+
+首先,我要解释一下这个东西的命名。为了后续介绍方便,我们将其版本,抽象为:`a.b.c`,那么 `protoc 3.23.4` 就对应 `a=3, b=23, c=4`。
+
+在使用 `protoc --version` 时,打印出来的信息,都是类似于:`libprotoc 25.4` 的,它不带有前面的 `3`,所以此命令打印出来的,都是 `b.c` 的格式。至于 `a`,可以在其[官网](https://central.sonatype.com/artifact/com.google.protobuf/protobuf-java/versions)上查到:
+
+
+
+可以看到,`3.25.4` 是 `a=3` 的最后一个版本,而对于 `a=4`,后续的一个插件是暂不支持的,下图是该插件`(protoc-jar)`的[官方 issues](https://github.com/os72/protoc-jar/issues/106):
+
+
+
+而 3.25.4 可行的理由是:
+
+1. 原先的 3.23.4 版本,目前来看无法直接编译,会遇到两个问题,其中一个,是因为其的依赖:`abseil-cpp` 的版本**过高**。目前知道,3.23.4 是 23 年 7 月发布的,`abseil-cpp` 23 年 1 月 lts 的版本就已经过高了。同时,官方也有人提出此问题,但得到的答复是,`用最新的protobuf不就好啦?`
+2. 3.25.4 是较新的,且 Google 官方说它们的程序具有兼容性。
+ 
+3. 最开始,我想着能编译最新版,就直接用最新版,所以我编译的是 `protoc 3.27.3`,编译成功了,但因为 `a应该是4`,但命名是 `a=3` 导致后续下载某资源时报错。
+4. 我将 `27.3` 的 `a` 改为 `a=4`,但遇到了上面的`protobuf4不支持`问题。
+
+所以,版本选择为 `3.25.4`。
+
+## 2. 准备一份 protoc-jar
+
+### 报错信息
+
+在编译时,一个叫 `protoc-jar-maven-plugin` 的插件会导致报错,经过溯源,核心错误位置在于它的一个依赖:`protoc-jar`。此 jar 包内有一个类,叫做`PlatformDetector.java`,它不支持 riscv64 架构,导致崩溃。出错位置的记录,在:[https://github.com/os72/protoc-jar/issues/110](https://github.com/os72/protoc-jar/issues/110)
+
+### 解决方案
+
+解决方法很简单,只需要添加支持即可。目前,我准备了一份更改后,打好的 jar 包,位置在[此仓库](https://gitee.com/wang-yijia_DB/protobuf-on-riscv64)。
+
+### 下载 & 安装 方法
+
+```bash
+# 下载
+git clone https://gitee.com/wang-yijia_DB/protobuf-on-riscv64.git
+# 切换目录
+cd protobuf-on-riscv64
+# 安装
+mvn install:install-file -Dfile=./protoc-jar-3.11.4.jar -DgroupId=com.github.os72 -DartifactId=protoc-jar -Dversion=3.11.4 -Dpackaging=jar
+```
+
+## 3. 准备对应版本 的 grpc-java
+
+我们看到,在 `spark-3.5.1` 的 `project/SparkBuild.scala` 中,有一个叫 `GRPC` 的依赖,它的版本是 `1.56.0`,全称为:`protoc-gen-grpc-java`。而这个版本,在 `openeuler 24.04LTS (riscv64)`上,截止`2024-09-04`,是找不到的。
+
+注:下面的各种下载的成功与否,都取决于网速,所以网速很重要!
+
+### i. 准备 gradle
+
+grpc 编译时会下载此版本,故需要先下载下来,以免后续下载时间过长而报错。(注:不需要解压)
+
+```bash
+# 我的教程,是以在 $HOME 下存放 gradle 为例的
+# 如果进行了修改,要记住其路径,后续要用到
+pushd ~
+wget -c https://services.gradle.org/distributions/gradle-7.6-bin.zip
+popd
+```
+
+### ii. 下载 grpc-java 源码与 添加修改
+
+```bash
+wget -c https://github.com/grpc/grpc-java/archive/refs/tags/v1.56.0.tar.gz
+tar -zxf ./v1.56.0.tar.gz
+rm ./v1.56.0.tar.gz
+cd grpc-java-1.56.0
+```
+
+然后,需要修改大量内容,如下所示:
+
+#### 1- build.gradle - 换源
+
+```bash
+# 修改 build.gradle,主要是换源
+vi build.gradle
+
+# 在 repositories 中添加:
+maven { url 'file://@HOME@/.m2/repository'}
+maven { url "https://mirrors.huaweicloud.com/repository/maven/"}
+
+# Esc + :wq
+```
+
+#### 2- buildscripts/kokoro/ 下的修改 - linux_artifacts.sh
+
+```bash
+vi buildscripts/kokoro/linux_artifacts.sh
+# 在第56行添加下面内容,通过 在vim命令模式内直接输入 “56” + enter 来跳转
+"$GRPC_JAVA_DIR"/buildscripts/run_in_docker.sh grpc-java-artifacts-multiarch env \
+ SKIP_TESTS=true ARCH=risv64 /grpc-java/buildscripts/kokoro/unix.sh
+```
+
+
+
+#### 3- buildscripts/kokoro/unix.sh
+
+```bash
+vi buildscripts/kokoro/unix.sh
+
+# 修改1,将并行关闭
+# 输入下面内容来搜索
+# / -Dorg.gradle.parallel
+# 将其修改为:
+-Dorg.gradle.parallel=false
+
+
+# 修改2,增加其对rv的支持
+# 输入下面内容来搜索
+# /"$ARCH"
+# 再连续按两下 n,跳转到第三个被搜索出来的内容
+# 在 判断 条件中增加:
+ || "$ARCH" = "riscv64"
+```
+
+修改 1 的内容为:
+
+
+
+修改 2 的内容为:
+
+
+#### 4- buildscripts/kokoro/upload_artifacts.sh
+
+```bash
+vi buildscripts/kokoro/upload_artifacts.sh
+
+
+# 在合适位置,例如第35行后,增加下面内容
+# for linux riscv64 platform
+[[ "$(find "$LOCAL_MVN_ARTIFACTS" -type f -iname 'protoc-gen-grpc-java-*-linux-riscv64.exe' | wc -l)" != '0' ]]
+```
+
+
+
+#### 5- buildscripts/make_dependencies.sh
+
+```bash
+vi buildscripts/make_dependencies.sh
+
+# 修改1,修改 protobuf 版本
+# 通过搜索 “PROTOBUF_VERSION” 定位
+PROTOBUF_VERSION=25.4
+# 注:修改1位置极为明显,甚至可以不用搜索,故不提供图例
+
+# 修改2,防止污染环境
+# 通过搜索 “ARCH” 来定位,这两个目录出现在 ARCH 的下面
+# 将下面两行目录,从 “/tmp” 改为 "/var/tmp"
+# 修改前:
+DOWNLOAD_DIR=/tmp/source
+INSTALL_DIR="/tmp/protobuf-cache/$PROTOBUF_VERSION/$(uname -s)-$ARCH"
+# 修改后:
+DOWNLOAD_DIR="/var/tmp/source"
+INSTALL_DIR="/var/tmp/protobuf-cache/$PROTOBUF_VERSION/$(uname -s)-$ARCH"
+
+# 修改3,增加对 riscv 的支持
+# 在第38行,增加下面内容:
+ elif [[ "$ARCH" == riscv* ]]; then
+ ./configure --disable-shared --host=riscv64-linux-gnu --prefix="$INSTALL_DIR"
+```
+
+修改 2 的内容为:
+
+
+修改 3 的内容为:
+
+
+#### 6- compiler/build.gradle
+
+```bash
+vi compiler/build.gradle
+
+# 修改1,为 gcc 增加 target
+# 在第 59 行后另起一行,增加下面内容:
+ target("riscv64")
+
+# 修改2,在 platforms 下,增加支持
+# 在 platforms 内的 aarch_64 下面另起一行,增加:
+ riscv64 { architecture "riscv64" }
+
+# 修改3,在 java_plugin 下,增加支持
+# 在 java_plugin 下,aarch_64 下,另起一行增加:
+ 'riscv64',
+
+# 修改4,修订cpp风格,之前安装abseil用的cpp版本是多少
+# 这里就得改成多少
+# 输入 /c++0x
+# 修改为 c++20
+cppCompiler.args "--std=c++20"
+# 注:修改4位置唯一,不提供图例
+```
+
+修改 1 的内容为:
+
+
+修改 2 的内容为:
+
+
+修改 3 的内容为:
+
+
+#### 7- compiler/check-artifact.sh
+
+```bash
+vi compiler/check-artifact.sh
+
+# 修改1,修改 checkArch() 这个函数
+# 先要搜索到 checkArch 这个函数
+# 在 OS 为 linux 下,增加对 riscv 的支持
+ elif [[ "$ARCH" == riscv64 ]]; then
+ assertEq $format "elf64-littleriscv" $LINENO
+
+# 修改2,修改 checkDependencies() 这个函数
+# 先要搜索到 checkDependencies 这个函数
+# 在 OS 为 linux 下,增加对 riscv 的支持
+ elif [[ "$ARCH" == riscv64 ]]; then
+ dump_cmd='objdump -p '"$1"' | grep NEEDED'
+ white_list="libm\.so\.6\|libc\.so\.6\|ld-linux-riscv64-lp64d\.so\.1"
+```
+
+修改 1 的内容为:
+
+
+修改 2 的内容为:
+
+
+### iii. 再次准备 protobuf
+
+在上面的 `5-` 步,我们修改了编译 `grpc-java` 时使用的 `PROTOBUF_VERSION` 和 `INSTALL_DIR`,所以我们现在要在对应的 `INSTALL_DIR` 里准备我们刚刚编译好的 `protobuf (v3.25.4)`。
+
+```bash
+# 下面命令,根据你的 protobuf 版本动态切换!
+mkdir -p /var/tmp/protobuf-cache/25.4/Linux-riscv64/bin
+pushd /var/tmp/protobuf-cache/25.4/Linux-riscv64/bin/
+cp /usr/local/bin/protoc ./
+popd
+```
+
+### iv. 编译安装 grpc-java
+
+```bash
+# 替换掉对 HOME 的命名
+sed -i "s,@HOME@,${HOME},g" build.gradle
+
+# 替换掉gradle,路径要写实际的路径!
+# 同时注,不要手动修改!脚本执行会把${HOME}转译
+# 但手动修改时要写绝对路径!
+sed -i "s|https\\\\://services.gradle.org/distributions|file://${HOME}|g" gradle/wrapper/gradle-wrapper.properties
+# 再注:如果真的手写,则file:后面,跟着连续的3个斜杠!
+# 例:file:///home/user/gradle-7.6-bin.zip
+
+# 编译安装
+SKIP_TESTS=true ARCH=riscv64 ./buildscripts/kokoro/unix.sh
+mvn install:install-file -DgroupId=io.grpc -DartifactId=protoc-gen-grpc-java -Dversion=1.56.0 -Dclassifier=linux-riscv64 -Dpackaging=exe -Dfile=mvn-artifacts/io/grpc/protoc-gen-grpc-java/1.56.0/protoc-gen-grpc-java-1.56.0-linux-riscv64.exe
+```
+
+### v. 本部分加速方法
+
+我使用 `git diff` 工具,打了一个 `patch`,能够顺便将 jdk 版本切换至 jdk17,所以,可以在 `grpc-java-1.56.0` 目录下,使用命令:`patch -p1 PATH_TO_PATCH` 来安装我的 `grpc-patch.patch`。
+
+我将这个 `patch`,发布在了:[https://gitee.com/wang-yijia_DB/protobuf-on-riscv64](https://gitee.com/wang-yijia_DB/protobuf-on-riscv64)
+
+## 4. pom.xml 内的修改
+
+### i. os-maven-plugin 的版本
+
+如果不进行修改,会报错:
+
+
+
+经过排查,问题出现在 Spark 源码目录的 connector 目录下。具体出错位置为:`spark-3.5.1/connector/connect/common/pom.xml`。可以调用下面脚本找到:
+
+```bash
+# 位于目录 spark-3.5.1 下
+# 在终端输入下列命令,寻找出问题的地方:
+find . -name 'pom.xml' | xargs grep 'os-maven-plugin'
+
+# 修复问题
+vi ./connector/connect/common/pom.xml
+
+# 输入 `/os-maven-plugin` ,则能够找到位置
+# 将版本改为 1.7.1
+
+ # 其它内容省略
+ # 原先版本是 1.6.2
+ 1.7.1
+ # 其它内容省略
+
+# 按 Esc, 然后输入 “:wq” 来保存退出
+
+# 切回源码目录,之后此项就可以正常编译
+cd ../../../
+```
+
+### ii. maven 的版本 & scala 的版本
+
+由于后续组件会检测 maven 版本,而 截止 `2024-09-04`,`openeuler 24.04LTS (riscv64)` 上 maven 版本支持仅到 3.6.3,所以需要修改 maven 版本,具体操作如下:
+
+```bash
+# 位于 spark-3.5.1 目录下
+vi ./pom.xml
+
+# 输入 /
+# 改为 3.6.3
+3.6.3
+
+# 因此造成,scala 版本也要降低
+# 输入 /scala-parallel-collections
+# 改为 1.0.3
+1.0.3
+
+# Esc, 然后输入 “:wq”
+```
+
+### iii. jdk 的版本
+
+首先,需要准备自身系统里的 jdk,准备的方式在本教程的第一部分中有介绍。
+
+然后,还是要修改 `pom.xml` 中的版本信息来修改:
+
+```bash
+# 位于 spark-3.5.1 目录下
+vi ./pom.xml
+
+# 输入 /java.version
+# 改为 17,原先是 1.8
+17
+
+# 因此造成,jvm 版本也要进行修改,不然貌似仍然没有加速效果
+# 输入 /scala-maven-plugin
+# 将下面的 jvm-1.8 改为 jvm-17
+-target:jvm-17
+
+# 注:整个 spark-3.5.1 的 pom.xml 内,有两个涉及到 “jvm” 的
+# 第二个不用修改,因为后续会将其测试跳过。
+# 真正需要修改的,是位于 scala-maven-plugin 插件里的那个
+
+# Esc, 然后输入 “:wq”
+```
+
+### iv. protobuf 和 protobuf-java 的版本
+
+```bash
+# 编辑 pom.xml 文件
+vi pom.xml
+
+# 输入 /protobuf.version
+# 改为你编译出的 protobuf 版本,我使用的是 3.25.4
+# 原先是 3.23.4
+3.25.4
+# 注:其位于 标签下
+
+# Esc, 然后输入 “:wq”
+```
+
+在修改时,可以注意到官方说明:
+
+> SPARK-41247: When updating `protobuf.version`, also need to update `protoVersion` in `SparkBuild.scala`
+
+根据官方留的说明,我们还要改 `SparkBuild.scala`,其地址为:`spark-3.5.1/project/SparkBuild.scala`。
+
+```shell
+# 位于 spark-3.5.1 目录下
+vi ./project/SparkBuild.scala
+
+# 输入 /protobuf.version
+# 改为你编译出的 protobuf 版本,我使用的是 3.25.4
+# 原先是 3.23.4
+# 我们可以看一下此处的官方的说明:
+// Google Protobuf version used for generating the protobuf.
+// SPARK-41247: needs to be consistent with `protobuf.version` in `pom.xml`.
+val protoVersion = "3.25.4"
+// GRPC version used for Spark Connect.
+val grpcVersion = "1.56.0"
+
+# Esc, 然后输入 “:wq”
+```
+
+### v. 换源
+
+在编译前,还需要进行换源,国外 google 的 maven 拉取太慢,参照 maven 官方文档内容,将 maven 的组件下载源换源至华为镜像的操作如下:
+
+```bash
+# 编辑 pom.xml 文件
+vi ./pom.xml
+
+# 在标签的第一位添加华为 Maven 仓库源
+
+ huaweicloud-maven
+ https://mirrors.huaweicloud.com/repository/maven/
+
+
+# 在标签第一位添加华为 Maven 源。
+
+ huaweicloud-plugin
+ https://mirrors.huaweicloud.com/repository/maven/
+
+
+# 按 Esc, 然后输入 “:wq”
+```
+
+## 编译命令
+
+### 核心命令
+
+在经历了上面的修改后,我们可以开始编译了,核心命令(仍然是`spark-3.5.1`目录下):
+
+```bash
+dev/make-distribution.sh --name riscv64 --tgz -Pyarn,hive,hive-thriftserver,sparkr -DskipTests -Dmaven.compiler.optimize=false -Dmaven.test.skip=true -Dmaven.javadoc.skip=true -Dmaven.scaladoc.skip=true -T 32
+```
+
+### 涉及参数的说明
+
+| 命令 / 参数 | 原理 |
+| ------------------------------- | --------------------------------------------------------------------------------------------- |
+| dev/make-distribution.sh | 根据 spark 官方的 build 文档,调用 dev/make-distribution.sh 来进行编译 |
+| --name | 指定编译成果的名字,成果的命名为:`spark-3.5.1-bin-${name}`,指定的 name 将会被替换到它的位置 |
+| --tgz | 指定产物的类型为 .tgz 文件,我没有测试指定其它类型的效果 |
+| -P | 指定需要那些可选组件,我选了常用的 |
+| -DskipTests | 要求 maven 跳过测试,但其效果不明显,故需要后续其它参数的配合 |
+| -Dmaven.compiler.optimize=false | 让 maven 关闭编译优化,在 ‘控制变量’ 时有用 |
+| -Dmaven.test.skip=true | 跳过 maven 测试,可能与刚刚的跳过测试重复,但其实这两个,貌似都没什么效果 |
+| -Dmaven.javadoc.skip=true | 跳过 javadoc 的编译?不确定,但能够明显加速,且会跳过一部分的测试 |
+| -Dmaven.scaladoc.skip=true | 跳过 scaladoc 的编译?不确定,但这个也能明显加速,且会跳过大部分测试 |
+| -T 32 | 指定编译的并行数量,32 代表 32 核?也可能是 32 个进程 |
+
+### 我的 ‘最优’ 命令
+
+由于 spark 的编译较为耗时,而我无法长时间连接服务器,所以我使用了 `nohup` 指令使得编译在我登出后仍然进行。为了查看编译进度,我将编译的流程重定向到了 `build.log` 文件,同时采用 `&` 指定进程在后台运行。
+
+以下是适用我的情况的,最优编译命令:
+
+```bash
+nohup dev/make-distribution.sh --name riscv64 --tgz -Pyarn,hive,hive-thriftserver,sparkr -DskipTests -Dmaven.compiler.optimize=false -Dmaven.test.skip=true -Dmaven.javadoc.skip=true -Dmaven.scaladoc.skip=true -T 32 >>build.log &
+```
+
+**注[1]**:运行我的命令后,请记一下进程的 id 号,后续如果发生登出操作,需要此 id 号来判断是否流程进行完毕。
+
+**注[2]**:当执行了命令,且执行后未登出过服务器时,可以使用 `jobs` 命令查看进程是否完成,如果状态是 `Done`或 `Exited`,则完成了,结果可以查看 log 文件;如果状态是 `Terminated` ,则证明出现了问题,需要查看 log 文件。如果是其它状态,可以认为没有完毕。
+
+**注[3]**:如果执行后登出了服务器,请使用 `ps xxxxx`(`xxxxx` 替换为`注[1]`中,让你记下来的 id 号)来查看进展,剩下的状态判断操作同`注[2]`。或者,你可以直接查看 log 文件的最下方,来查看编译进度。
+
+## 附录:潜藏问题
+
+1. 我跳过了 `javadoc` 和 `scaladoc`,但其实在保留 `scaladoc` 时,编译过程中出现了因为 `scalatest` 引起的报错。我尝试过关闭 `maven` 的测试,但并没有用,该测试还是执行。直到我在看源码时,发现 `scalatest` 取决于 `scaladoc` 后,我关闭了 `scaladoc`。之后,才通过了编译,但这可能隐藏着某些问题,不过在我现在的测试进展来看,并没有什么异常问题。
+
+2. 在准备 `grpc-java` 时,其中有一步手动下载了 `gradle-7.6-bin.zip`。它是真的是一个二进制文件吗?为什么在使用它时,也不会引起报错呢?它需要重新源码编译一遍吗?这些问题我也没有深究。