Apache Uniffle 0.10.0 介绍与选型指南

Apache Uniffle 0.10.0 介绍与选型指南:远程 Shuffle 服务架构与工作流程、Spark 与 MapReduce 客户端接入、动态分配支持与 0.10.0 亮点,及与 Apache Celeborn、Spark 原生 ESS 的量化选型对比。

Apache UniffleApache Uniffle2026/10/18

Apache Uniffle 0.10.0 介绍与选型指南

一、信息基准

本章说明本文所有事实性信息的核查时间与来源依据,全部信息均取自 Apache Uniffle 官方渠道,未做任何本地实测推算。

1.1 版本基准

项目内容
本文介绍的软件版本Apache Uniffle 0.10.0(官方最新稳定版)
查询日期2026-10-18
版本判定依据downloads.apache.org/uniffle/ 目录中最高版本目录为 0.10.0,目录内发行包 apache-uniffle-0.10.0-bin.tar.gz 时间戳为 2025-09-19
版本节奏佐证GitHub 仓库 apache/uniffle 的 releases.atom 订阅源中,v0.10.0 发布于 2025-09-25,上一稳定版 v0.9.2 发布于 2025-01-09
项目状态Apache 顶级项目(projects.apache.org 基金会 PMC 列表收录 uniffle)

1.2 官方来源清单

来源地址用途
项目官网https://uniffle.apache.org/项目定位、文档入口
官方发行目录https://downloads.apache.org/uniffle/最新稳定版 0.10.0 与历史版本
官方介绍文档https://uniffle.apache.org/docs/intro架构、Shuffle 流程、支持的 Spark/MapReduce 版本
官方客户端指南https://uniffle.apache.org/docs/client-guideSpark/MapReduce 客户端接入配置
GitHub 仓库https://github.com/apache/uniffle代码、Release 记录、stars 数
GitHub 订阅源https://github.com/apache/uniffle/releases.atom版本发布时间线
Maven Centralhttps://repo1.maven.org/maven2/org/apache/uniffle/客户端 shaded 构件(现存 rss-client-spark2-shaded、rss-client-spark3-shaded)

二、软件概述

本文介绍的是 Apache Uniffle 0.10.0。Uniffle 官方定义为"高性能、通用的远程 Shuffle 服务"(Remote Shuffle Service),为 Apache Spark 等计算框架提供把 Shuffle 数据写到远端服务器集群的能力,从而把计算过程中的中间数据交换与计算节点本身解耦。项目官方主页(uniffle.apache.org)将其描述为"a high performance, general purpose remote shuffle service for distributed computation",GitHub 官方仓库简介为"Uniffle is a high performance, general purpose Remote Shuffle Service"。

Uniffle 原名 RSS,由工业界生产环境的大规模 Spark 作业实践发展而来,后捐赠给 Apache 软件基金会孵化,现已从孵化器毕业为 Apache 顶级项目:projects.apache.org 的基金会 PMC 委员会列表已收录 uniffle,且其官方发行物直接发布在 downloads.apache.org/uniffle/(顶级项目路径)下,发行包命名不再带孵化后缀。当前官方最新稳定版为 2025 年 9 月发布的 0.10.0。

对 Spark 用户而言,Uniffle 解决的核心痛点是:原生 Shuffle 把中间数据落在计算节点本地磁盘上,导致磁盘 IO 打满、长尾任务拖慢整体作业、动态资源伸缩受限;而把 Shuffle 数据交给专门的远程 Shuffle 集群后,计算节点可以更激进地伸缩,大规模作业的稳定性也更容易保障。

三、核心架构

3.1 组件构成

依据官方介绍文档(uniffle.apache.org/docs/intro),Uniffle 0.10.0 包含三类组件:

组件职责
Coordinator收集各 Shuffle Server 的状态,为作业分配 Shuffle Server;客户端先向 Coordinator 请求可用节点
Shuffle Server接收客户端发来的 Shuffle 数据,在内存中缓存并合并,再写入存储层
远程存储Shuffle Server 的落盘目标,例如 HDFS;按配置也可以只写本地磁盘

3.2 Shuffle 处理流程

官方文档对一次 Shuffle 的完整流程描述如下:

  1. Spark Driver 向 Coordinator 请求,获取本次作业要使用的 Shuffle Server 列表。
  2. Spark 任务将 KV 数据发送到客户端缓冲区,缓冲区写满或缓冲管理器达到上限后刷新进队列。
  3. 客户端线程池从队列取出数据,先向 Shuffle Server 申请内存,再发送 Shuffle 数据。
  4. Shuffle Server 先把数据缓存在内存,缓冲管理器写满后进入落盘队列,由线程池写入存储。
  5. 数据文件按"数据文件 + 索引文件"组织:数据文件保存某分区的全部数据块,索引文件记录每个数据块的元信息。
  6. 写入完成后,任务把全部 blockId 上报给 Shuffle Server,用于后续读取时的数据校验。
  7. 任务的 taskAttemptId 被存入 MapStatus,以支持 Spark 的推测执行(speculation)。
  8. 依据存储类型不同,Reduce 端从 Shuffle Server、远程存储或两者读取数据。

3.3 存储类型

官方文档给出三种存储形态:

存储类型说明
Memory & Local内存加本地磁盘
Memory & Remote Storage内存加远程存储(如 HDFS)
Memory & Local & Remote Storage内存、本地磁盘、远程存储三者结合,官方标注为生产环境推荐形态

四、功能特性

4.1 多计算框架统一 Shuffle

依据官方客户端指南(uniffle.apache.org/docs/client-guide),Uniffle 定位为"面向多种计算框架的统一 Shuffle 引擎",当前官方提供了 Spark 与 Hadoop MapReduce 两类可插拔客户端:

  • Spark 2.x 与 Spark 3.x 分别提供独立的 shaded 客户端构件(发行包内位于 jars/client/spark2 与 jars/client/spark3 目录)。
  • MapReduce 客户端构件位于 jars/client/mr 目录,通过替换 MapOutputCollector 与 Shuffle Consumer 插件接入。
  • 对 Spark 3.5 及以上版本,官方支持通过 Spark 的 Push-Based Shuffle 插件机制接入:在原有配置之上增加 spark.shuffle.sort.io.plugin.class=org.apache.spark.shuffle.RssShuffleDataIo 即可,无需再打补丁。

4.2 动态资源分配支持

官方文档说明,要让 Spark 动态资源分配(Dynamic Allocation)与 Uniffle 配合,Spark 2.3.4/2.4.6/3.0.1/3.1.2/3.2.1/3.3.1/3.4.1 七个版本需要应用发行包 patch/spark 目录中的补丁并重新构建 Spark,之后设置 spark.shuffle.service.enabled=false、spark.dynamicAllocation.enabled=true。对 Spark 3.5 及以上版本,则通过上一节提到的插件配置直接获得动态分配支持。0.10.0 的更新记录还显示,对 Gluten(Velox 后端向量化加速引擎)场景的动态分配也提供了支持。

4.3 0.10.0 版本亮点

依据 GitHub v0.10.0 的官方发布记录,该版本包含的主要更新方向有:

  • Shuffle Server 的 Rust 实验性实现持续推进(仓库 rust/experimental/server 目录,0.10.0 继续修复与迭代)。
  • 服务端指标增强:新增读取本地文件数据的 gauge 指标、修复大分区数(huge_partition_num)指标问题。
  • Spark 3 客户端支持从多个被重新分配(reassignment)的服务端读取分区数据,提升副本迁移后的读取可用性。
  • Kubernetes Operator 修复:应用全部过期后 ShuffleServer 可被正常删除。
  • 服务端过期应用目录清理、Netty 通道写入保护、下线无意义的事件缓存等多项稳定性修复。
  • 官方文档补充了部分 TPC-DS(SF=40000)查询的性能报告。

五、快速上手

本节内容引自官方文档(不涉及本地实测),包括构建方式与两类计算引擎的客户端接入要点。

5.1 构建与发行包

依据官方介绍文档,构建 Uniffle 需要 JDK 1.8(官方说明后续 JDK 支持在路线图中),使用 Maven 构建:

mvn -DskipTests clean package

官方提供的构建档位包括 -Pspark2(对应 Spark 2.4.6)、-Pspark3(对应 Spark 3.1.2)、-Pspark3.2 等;打包发行包使用发行包脚本 build_distribution.sh。日常使用更推荐直接从 downloads.apache.org/uniffle/0.10.0/ 下载 apache-uniffle-0.10.0-bin.tar.gz。

5.2 Spark 客户端接入

依据官方客户端指南,接入步骤为:

  1. 把对应 Spark 版本的 shaded 客户端构件放入 SPARK_HOME/jars/ 目录(Spark2 构件位于发行包 jars/client/spark2/rss-client-XXXXX-shaded.jar,Spark3 构件位于 jars/client/spark3/ 下)。
  2. 更新 Spark 配置:
spark.shuffle.manager org.apache.spark.shuffle.RssShuffleManager
spark.rss.coordinator.quorum <coordinatorIp1>:19999,<coordinatorIp2>:19999
  1. 官方特别提示:Spark 2 不支持 AQE,因此需要设置 spark.sql.adaptive.enabled=false。
  2. 如使用 Spark 3.5 及以上版本并希望以插件方式支持动态分配,追加:
spark.shuffle.sort.io.plugin.class org.apache.spark.shuffle.RssShuffleDataIo

5.3 MapReduce 客户端接入

依据官方客户端指南,MapReduce 侧接入要点:

  1. 把 jars/client/mr/rss-client-mr-XXXXX-shaded.jar 放入各 NodeManager 的 HADOOP_HOME/share/hadoop/mapreduce/ 类路径。
  2. 通过作业参数指定 Coordinator 地址与应用主类:
-Dmapreduce.rss.coordinator.quorum=<coordinatorIp1>:19999,<coordinatorIp2>:19999
-Dyarn.app.mapreduce.am.command-opts=org.apache.hadoop.mapreduce.v2.app.RssMRAppMaster
-Dmapreduce.job.map.output.collector.class=org.apache.hadoop.mapred.RssMapOutputCollector
-Dmapreduce.job.reduce.shuffle.consumer.plugin.class=org.apache.hadoop.mapreduce.task.reduce.RssShuffle
  1. 官方说明 RssMRAppMaster 会自动关闭慢启动(mapreduce.job.reduce.slowstart.completedmaps=1)与作业恢复(yarn.app.mapreduce.am.job.recovery.enable=false)。

六、适用场景与限制

6.1 适用场景

  • 大规模 Spark 作业(数千乃至上万 Reduce 任务)频繁遭遇本地磁盘 IO 瓶颈或 Shuffle 长尾时,把 Shuffle 数据交给独立集群托管。
  • 计算节点需要弹性伸缩(尤其结合动态资源分配与抢占式/易失性节点)的场景,远程 Shuffle 使计算节点无状态化。
  • 存算分离架构:Shuffle 数据统一写入 HDFS 等远程存储,配合 Memory & Local & Remote Storage 三级形态兼顾性能与可靠性。
  • 结合 Gluten 向量化加速栈的 Spark 作业,0.10.0 已支持该场景下的动态分配。
  • MapReduce 作业希望复用同一套远程 Shuffle 集群时,可使用官方 MR 客户端。

6.2 已知限制

  • 官方介绍文档标注当前支持 Spark 2.3.x 至 Spark 3.3.x,并对 Spark 3.5+ 提供插件接入方式;介于其间的版本组合需以官方文档与实测为准。
  • Spark 3.4.1 及以下的动态分配支持依赖官方补丁重新构建 Spark,运维成本较高。
  • Spark 2 不支持 AQE,需关闭 spark.sql.adaptive.enabled。
  • MapReduce 侧官方基准为 Hadoop 2.8.5 的 MapReduce 框架,其他 Hadoop 版本需自行验证。
  • 构建 Uniffle 本身要求 JDK 1.8,官方明确新 JDK 支持仍在路线图中。
  • 需要额外维护 Coordinator 与 Shuffle Server 集群(或 Kubernetes Operator),引入新的运维对象。
  • 0.10.0 仍为 0.x 版本线,主版本号尚未到 1.0,接口与配置项存在调整可能。

七、同类选型对比

7.1 对比对象与数据基准

选取与 Uniffle 定位最接近的两类方案做对比:同为独立远程 Shuffle 服务的 Apache Celeborn,以及 Spark 自带的 External Shuffle Service(ESS,随 Apache Spark 发行)。对比数据于 2026-10-18 取自各项目官方渠道:GitHub 仓库页(stars 数)、GitHub releases.atom 订阅源(发版时间)、downloads.apache.org 发行目录。

7.2 量化对比

维度Apache Uniffle 0.10.0Apache Celeborn v0.7.0Spark 原生 ESS(Apache Spark 4.2.0 内置)
开源许可Apache-2.0Apache-2.0Apache-2.0
GitHub stars + 最近发版455 stars;v0.10.0(2025-09-25)1072 stars;v0.7.0(2026-08-17)44237 stars(Apache Spark 仓库);当前发行目录最新为 Spark 4.2.0
版本节奏2024 年内连发 0.9.0/0.9.1,2025-01 发 0.9.2,2025-09 发 0.10.0,半年至一年一个稳定版0.x 系列持续迭代,至 2026-08 发布 0.7.0,社区活跃度较高随 Spark 主版本滚动发布,无独立版本号
兼容矩阵Spark 2.3.x–3.3.x(官方文档标注),Spark 3.5+ 插件接入,MapReduce 基于 Hadoop 2.8.5,构建需 JDK 1.8官方定位为面向 shuffle 与溢写数据的弹性高性能服务,主要服务 Spark 等大数据引擎(以官方文档为准)随 Spark 内置,版本天然对齐;无跨引擎支持,仅服务 Spark 自身 Shuffle

补充说明:三者许可一致(Apache-2.0),差异主要体现在社区规模与产品形态。ESS 是零新增组件的默认方案但能力上限低;Celeborn 与 Uniffle 都是独立 Shuffle 服务,Celeborn 的 GitHub 关注度与发版节奏略占优,Uniffle 在 Spark 2 老版本兼容、MapReduce 接入与 Rust 实验性服务端等方向有差异化投入。

7.3 选型建议

若团队已深度使用 Spark 且规模可控,优先评估 Spark 原生 ESS 即可;当作业规模或节点弹性需求超出 ESS 能力上限、需要独立 Shuffle 集群时,再在 Uniffle 与 Celeborn 之间做 PoC 对比——需要兼容 Spark 2 老作业或 MR 作业统一接入时 Uniffle 0.10.0 值得优先验证,纯 Spark 3/Spark 4 新集群则两者均可并按实测性能与社区响应决定。

八、参考链接