1.构建环境

构建环境:
ubuntu 22.04
jdk 11
scala 2.12
maven 3.9
spark 3.5

2.构建

获取代码

pull代码后,切换到对应分支。

git checkout branch-3.5

编译

构建spark

mvn -DskipTests clean package \
  -Dhadoop.version=3.3.6 \
  -Phive -Phive-thriftserver -Pyarn -Pscala-2.12

参数说明

-DskipTests:跳过测试(提高速度)
-Phive:启用 Hive 支持
-Phive-thriftserver:构建 Hive Thrift Server(JDBC Server)
-Pscala-2.12:Spark 3.5 默认使用 Scala 2.12
-Dhadoop.version:可选指定目标 Hadoop 版本

构建结果

[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary for Spark Project Parent POM 3.5.6-SNAPSHOT:
[INFO] 
[INFO] Spark Project Parent POM ........................... SUCCESS [  5.100 s]
[INFO] Spark Project Tags ................................. SUCCESS [  6.722 s]
[INFO] Spark Project Sketch ............................... SUCCESS [  7.578 s]
[INFO] Spark Project Local DB ............................. SUCCESS [  8.549 s]
[INFO] Spark Project Common Utils ......................... SUCCESS [  9.026 s]
[INFO] Spark Project Networking ........................... SUCCESS [ 11.460 s]
[INFO] Spark Project Shuffle Streaming Service ............ SUCCESS [ 11.545 s]
[INFO] Spark Project Unsafe ............................... SUCCESS [ 10.493 s]
[INFO] Spark Project Launcher ............................. SUCCESS [ 12.353 s]
[INFO] Spark Project Core ................................. SUCCESS [02:11 min]
[INFO] Spark Project ML Local Library ..................... SUCCESS [ 25.905 s]
[INFO] Spark Project GraphX ............................... SUCCESS [ 28.294 s]
[INFO] Spark Project Streaming ............................ SUCCESS [ 42.562 s]
[INFO] Spark Project SQL API .............................. SUCCESS [ 29.525 s]
[INFO] Spark Project Catalyst ............................. SUCCESS [02:35 min]
[INFO] Spark Project SQL .................................. SUCCESS [03:45 min]
[INFO] Spark Project ML Library ........................... SUCCESS [02:02 min]
[INFO] Spark Project Tools ................................ SUCCESS [  4.805 s]
[INFO] Spark Project Hive ................................. SUCCESS [ 57.008 s]
[INFO] Spark Project REPL ................................. SUCCESS [ 17.330 s]
[INFO] Spark Project Hive Thrift Server ................... SUCCESS [ 32.332 s]
[INFO] Spark Project Assembly ............................. SUCCESS [  8.576 s]
[INFO] Kafka 0.10+ Token Provider for Streaming ........... SUCCESS [ 15.543 s]
[INFO] Spark Integration for Kafka 0.10 ................... SUCCESS [ 36.375 s]
[INFO] Kafka 0.10+ Source for Structured Streaming ........ SUCCESS [ 32.824 s]
[INFO] Spark Project Examples ............................. SUCCESS [ 37.571 s]
[INFO] Spark Integration for Kafka 0.10 Assembly .......... SUCCESS [  5.331 s]
[INFO] Spark Avro ......................................... SUCCESS [ 35.194 s]
[INFO] Spark Project Connect Common ....................... SUCCESS [ 39.677 s]
[INFO] Spark Protobuf ..................................... SUCCESS [ 31.574 s]
[INFO] Spark Project Connect Server ....................... SUCCESS [ 41.291 s]
[INFO] Spark Project Connect Client ....................... SUCCESS [ 47.043 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  21:28 min
[INFO] Finished at: 2025-05-28T17:53:47+08:00
[INFO] ------------------------------------------------------------------------

构建 PySpark 部分的 Python 包

cd python
python3 setup.py sdist

这会在 dist/ 目录下生成 pyspark-.tar.gz,你可以用 pip install 安装。

构建结果
在这里插入图片描述

3.安装包

Spark 没有构建成一个 .tar.gz 包,而是构建出对应目录结构:

.
├── bin/                 # 启动脚本
├── sbin/                # 管理脚本
├── assembly/target/scala-2.12/jars/   # 所有 jar 包
├── python/              # PySpark 源码
├── python/dist/         # PySpark 安装包(如 pyspark-3.5.6.tar.gz)
└── ...

Spark 的可用构建输出主要分布在以下几个目录:

路径 说明
assembly/target/scala-2.12/ 主 Spark 可执行包位置
assembly/target/scala-2.12/jars/ 所有 Spark 模块 jar 包合集(可作为 $SPARK_HOME/jars
python/dist/ PySpark 安装包(.tar.gz.whl
bin/sbin/ 原样保留,作为启动脚本使用
examples/ 示例代码
conf/ 示例配置文件

整理安装包

mkdir -p ~/spark-dist
cp -r bin sbin conf examples assembly/target/scala-2.12/jars python ~/spark-dist/

说明
spark发行版的安装包里有spark-*-yarn-shuffle.jar,构建出来没有。
在这里插入图片描述
移除原因
Apache Spark 从 3.3.0 版本开始移除 yarn-shuffle 模块,主要出于以下几个原因:

  1. Shuffle 服务应该由资源管理器维护,不应绑定在 Spark 内部
    Spark 的 YarnShuffleService 实际是一个 NodeManager 的 Auxiliary Service。
    它与 Spark 的核心逻辑关系不大,属于 YARN 的职责范围。
    把它放在 Spark 里维护带来了 依赖管理复杂度 和 构建臃肿。
    开发者更推荐使用 YARN(或 Hadoop)自带的 Shuffle Service。

  2. 模块长期缺乏维护
    yarn-shuffle 代码多年未更新,依赖老旧(如 Guava 版本问题)。
    不少用户 构建 Spark 时会遇到兼容性或编译错误。
    核心开发者决定将这个模块移除,避免成为项目技术债。

  3. 简化 Spark 构建系统(Maven/SBT)
    每个多模块构建都增加 CI/CD 负担。
    移除 rarely-used 模块有助于让 Spark 构建系统更清晰、精简。

  4. 社区使用比例极低
    大多数 Spark on YARN 部署 直接使用 Hadoop 提供的 shuffle service。
    官方发布版本中也 不再默认包含 spark-*-yarn-shuffle.jar。

移除影响
移除 yarn-shuffle 模块之后,依然可以正常将 Spark 任务提交到 YARN 上运行,不会影响 Spark on YARN 的核心功能。

功能 是否受影响 说明
提交 Spark 作业到 YARN(如 --master yarn ✅ 正常 Spark Application 会以 ApplicationMaster 形式运行在 YARN 上
使用 YARN ResourceManager 进行资源调度 ✅ 正常 Driver / Executor 会作为 YARN 容器启动
Spark on YARN 的集群模式和客户端模式 ✅ 正常 均不依赖 yarn-shuffle
依赖 Hadoop 自带的 shuffle-service ✅ 推荐做法 Hadoop 通常默认启用了该服务
Executor 之间进行 shuffle 读取 ✅ 正常 通过 Hadoop/YARN 提供的 Shuffle 服务支持

4.问题解决

1.报错禁止使用hive3.1.3

错误提示

[INFO] Finished at: 2025-05-28T17:03:46+08:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-enforcer-plugin:3.3.0:enforce (enforce-versions) on project spark-hive-thriftserver_2.12: 
[ERROR] Rule 3: org.codehaus.mojo.extraenforcer.dependencies.EnforceBytecodeVersion failed with message:
[ERROR] Found Banned Dependency: org.apache.hive:hive-service-rpc:jar:3.1.3
[ERROR] Use 'mvn dependency:tree' to locate the source of the banned dependencies.
[ERROR] -> [Help 1]
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.

原因
这个错误说明你在编译 Spark(特别是 spark-hive-thriftserver 模块)时,触发了 Maven Enforcer 插件的规则,禁止使用某个依赖:

Found Banned Dependency: org.apache.hive:hive-service-rpc:jar:3.1.3

Maven Enforcer 插件检测到 hive-service-rpc:3.1.3 是被禁止的字节码依赖(可能版本太新),因为它含有不兼容的 Java 字节码(比如编译时使用了 JDK 11+,但 Spark 要求是 JDK 8 字节码)。

解决方案

<enforceBytecodeVersion>
  <maxJdkVersion>${java.version}</maxJdkVersion>
  <ignoredScopes>test</ignoredScopes>
  <ignoredScopes>provided</ignoredScopes>
  <excludes>
    <!--
      TODO(SPARK-44032): Remove the exclusion of threeten-extra when orc-core fixes the violation
    -->
    <exclude>org.threeten:threeten-extra</exclude>
    <!-- 排除 hive-service-rpc -->
    <exclude>org.apache.hive:hive-service-rpc</exclude>
  </excludes>
</enforceBytecodeVersion>

增加

<!-- 排除 hive-service-rpc -->
<exclude>org.apache.hive:hive-service-rpc</exclude>

5.补充

还有一个这个构建命令,等于上面所有操作。

./dev/make-distribution.sh \
  --name custom-spark \
  --tgz \
  --r \
  -Phive -Phive-thriftserver -Pyarn -Pscala-2.12 \
  -Dhadoop.version=3.3.6

如果不需要R目录,可以移除

--r

在这里插入图片描述

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐