Apache Uniffle 0.10.0 配置参数详解

详解 Apache Uniffle 0.10.0 核心配置:coordinator.conf、server.conf、rss-env.sh 与 Spark 客户端参数的语义、默认值、同机端口冲突与准入检查实测结论。

Apache UniffleApache Uniffle2026/10/12

Apache Uniffle 0.10.0 配置参数详解

一、参数体系与查看方法

1.1 配置文件布局

Uniffle 0.10.0 的配置集中在发行包 conf 目录(本文按部署目录 /opt/uniffle 展开):

文件生效对象说明
conf/coordinator.confcoordinator 进程键值对格式,每行一个参数
conf/server.confshuffle-server 进程键值对格式(0.10.0 起替代旧版 shuffle-server.conf)
conf/rss-env.sh全部进程启动脚本shell 变量:JAVA_HOME、HADOOP_HOME、JVM 堆大小
conf/dashboard.confdashboard 进程Web 端口与 coordinator 地址
conf/log4j2.xml全部进程日志格式、级别、审计日志开关

1.2 参数加载机制

启动脚本按固定顺序加载:bin/uniffle-function.sh 与 bin/utils.sh 提供 shell 函数,conf/rss-env.sh 提供环境变量,随后各进程读取自己的 .conf 文件。两个要点:

  1. rss-env.sh 顶部有 set -o nounset 与 set -o errexit,文件中任何未定义变量引用都会直接中断启动脚本,HADOOP_HOME 必须显式定义。
  2. .conf 文件是 properties 风格键值对,不支持行内注释混写,注释行以 # 开头独立成行。

1.3 查看运行中生效参数

进程启动时会把完整 JVM 参数打印到控制台与日志头部,可用 jps -v 查看堆配置:

jps -v | grep -E 'CoordinatorServer|ShuffleServer'

实测回显(节选):

5819 org.apache.uniffle.coordinator.CoordinatorServer -Xms512m -Xmx512m ...
6008 org.apache.uniffle.server.ShuffleServer -Xms512m -Xmx512m ...

coordinator 的部分运行时状态可通过 HTTP 接口查询(实测端口 19990):

curl -s http://127.0.0.1:19990/api/coordinator/info
curl -s http://127.0.0.1:19990/api/server/nodes

二、coordinator.conf 核心参数

2.1 网络端口

参数默认值说明
rss.rpc.server.port19999coordinator 的 gRPC 服务端口,供 shuffle-server 心跳注册与计算引擎查询
rss.jetty.http.port19998coordinator 的 HTTP 端口,提供 REST API 与 /metrics

同机同时运行 coordinator 与 shuffle-server 时必须错开两套端口(发行包默认值两边完全相同),本文实测采用:coordinator 19991/19990,shuffle-server 19997/19996。

2.2 集群与心跳

参数默认值说明
rss.coordinator.server.heartbeat.timeout30000shuffle-server 心跳超时毫秒数,超时未收到心跳的节点从可用列表摘除并标记 LOST
rss.coordinator.app.expired600000应用级元数据过期时间毫秒数,应用结束后 coordinator 保留该应用的统计信息时长
rss.coordinator.exclude.nodes.file.pathfile:///xxx排除节点列表文件路径,发行包默认值指向不存在的占位路径,直接启动会受影响,单机部署应删除该行

2.3 准入与分配(实测重点)

参数默认值说明
rss.coordinator.shuffle.nodes.max13双重语义:一是 coordinator 返回给计算引擎的候选 shuffle 节点数上限;二是客户端 access 准入检查的默认必需可用节点数。单机部署必须设为 1,否则 Spark 客户端被 AccessClusterLoadChecker 拒绝并静默回退到原生 shuffle
rss.coordinator.select.partition.strategyCONTINUOUS分区到节点的分配策略,可选 CONTINUOUS(连续分配)与 ROUND_ROBIN(轮询)
rss.coordinator.access.loadChecker.memory.percentage15.0AccessClusterLoadChecker 判定节点可用的内存百分比阈值:节点剩余 buffer 容量占比达到该值的节点才计入可用节点数。注意键名结尾是 percentage,写成 percent 不会生效
rss.coordinator.access.checkersAccessClusterLoadChecker客户端准入检查器列表,逗号分隔;生产上至少保留负载检查器,小规模验证集群可结合 shuffle.nodes.max 一起调整

实测证据(反汇编 AccessClusterLoadChecker.check 的判定链):可用节点数 = 状态为 ACTIVE 且可用内存百分比达标的节点数;availableServerNumThreshold 未配置(-1)时与 rss.coordinator.shuffle.nodes.max 对应的默认必需节点数比较,小于则拒绝并输出 total N nodes, N available nodes, memory percent threshold X。

2.4 实测单机参考模板

rss.rpc.server.port 19991
rss.jetty.http.port 19990
rss.coordinator.server.heartbeat.timeout 30000
rss.coordinator.app.expired 600000
rss.coordinator.shuffle.nodes.max 1
rss.coordinator.select.partition.strategy CONTINUOUS

三、server.conf 核心参数

3.1 网络与注册

参数默认值说明
rss.rpc.server.port19999shuffle-server 的 gRPC 端口,接收计算引擎 shuffle 数据写入与读取请求
rss.jetty.http.port19998shuffle-server 的 HTTP 端口,提供 /metrics 指标
rss.coordinator.quorum无coordinator 地址列表,格式 host1:port1,host2:port2,端口填 coordinator 的 rpc 端口;多 coordinator 集群全部列出

3.2 存储类型与路径

参数默认值说明
rss.storage.typeMEMORY_LOCALFILE_HDFS存储类型:MEMORY_LOCALFILE(内存加本地文件)、LOCALFILE(纯本地文件)、MEMORY_LOCALFILE_HDFS(内存加本地文件加 HDFS)、HDFS。0.10.0 强制 LOCALFILE 与 HDFS 只能在 test mode 使用
rss.storage.basePath/xxx本地 shuffle 数据根目录,建议独立数据盘,目录需提前创建
rss.server.disk.capacity无默认本地存储容量上限,如 10g;超过后节点被标记不可用
rss.test.mode.enablefalse测试模式开关,键名为 rss.test.mode.enable(非 test.mode);LOCALFILE/HDFS 类型必须设 true

3.3 内存与刷盘

参数默认值说明
rss.server.buffer.capacity无默认shuffle 数据堆内 buffer 总容量(字节或 xg/xm 格式),写入先进 buffer,写满触发刷盘;该值加堆上其他开销应小于 JVM 堆上限
rss.server.read.buffer.capacity无默认读取数据的堆外 buffer 容量,影响并发读取吞吐
rss.server.flush.thread.alive10刷盘事件线程存活数
rss.server.flush.localfile.threadPool.size10本地文件刷盘线程池大小
rss.server.flush.hadoop.threadPool.size60HDFS 刷盘线程池大小(仅 HDFS 类型生效)
rss.server.single.buffer.flush.enabledtrue单 buffer 即刷开关,低负载下让数据更快落到本地文件
rss.server.single.buffer.flush.threshold2mb单 buffer 触发刷盘的容量阈值

3.4 实测单机参考模板(512MB 堆)

rss.rpc.server.port 19997
rss.jetty.http.port 19996
rss.storage.basePath /data/uniffle/shuffle_data
rss.storage.type MEMORY_LOCALFILE
rss.coordinator.quorum 127.0.0.1:19991
rss.server.buffer.capacity 256m
rss.server.read.buffer.capacity 128m
rss.server.flush.thread.alive 5
rss.server.flush.localfile.threadPool.size 10
rss.server.disk.capacity 10g
rss.server.single.buffer.flush.enabled true
rss.server.single.buffer.flush.threshold 64m

该模板在 Ubuntu 22.04 与 CentOS 8 双平台实测通过,shuffle-server 成功注册并完成 Spark 作业 shuffle 写读。

四、rss-env.sh 与 JVM 内存参数

变量默认值说明
JAVA_HOME无(注释占位)JDK 路径,必须显式设置
HADOOP_HOME无(注释占位)Hadoop 安装路径,启动脚本与 uniffle 命令行工具都会执行 HADOOP_HOME/bin/hadoop classpath,必须显式设置(即使不使用 HDFS 存储)
XMX_SIZE8gcoordinator 进程堆上限(同时作为 dashboard 堆的回退值)
SHUFFLE_SERVER_XMX_SIZE80gshuffle-server 进程堆上限

实测修改与验证:

grep -E '^(XMX_SIZE|SHUFFLE_SERVER_XMX_SIZE)' /opt/uniffle/conf/rss-env.sh
jps -v | grep ShuffleServer

实测回显(512MB 堆生效):

XMX_SIZE="512m"
SHUFFLE_SERVER_XMX_SIZE="512m"
6008 org.apache.uniffle.server.ShuffleServer -Xms512m -Xmx512m ...

rss.server.buffer.capacity 与 SHUFFLE_SERVER_XMX_SIZE 需联动规划:buffer 在堆内分配,buffer.capacity 应明显小于堆上限,实测组合 512m 堆加 256m buffer 运行稳定。

五、dashboard.conf 参数

参数默认值说明
rss.dashboard.http.port19997dashboard Web 端口;与 shuffle-server 常用 RPC 端口 19997 冲突,同机部署建议改为 19995
coordinator.web.address无coordinator 的 HTTP 地址,如 http://127.0.0.1:19990/,dashboard 通过它查询集群状态

实测:修改端口为 19995 并配置 coordinator 地址后,./start-dashboard.sh 启动成功,curl http://127.0.0.1:19995/ 返回 200。

六、Spark 客户端关键参数

写入 Spark 的 spark-defaults.conf 或 spark-submit --conf:

参数建议值说明
spark.shuffle.managerorg.apache.spark.shuffle.DelegationRssShuffleManager0.10.0 推荐用 Delegation 委托管理器:检测到 rss 参数可用时启用 Uniffle shuffle,准入失败时自动回退原生 shuffle(回退仅 WARN 日志,需留意)
spark.shuffle.enabledtrue允许 shuffle 管理器替换
spark.shuffle.service.enabledfalse关闭 Spark 外部 shuffle 服务,Uniffle 模式下不需要
spark.rss.coordinator.quorum127.0.0.1:19991coordinator 地址列表(rpc 端口),与 server.conf 的 quorum 指向同一组地址
spark.rss.storage.typeMEMORY_LOCALFILE与 server.conf 的存储类型对应;选 LOCALFILE 时必须同时设置 spark.rss.test.mode.enable true
spark.rss.test.mode.enablefalse客户端侧测试模式开关,纯 LOCALFILE/HDFS 类型需要设 true
spark.serializerorg.apache.spark.serializer.KryoSerializerUniffle 序列化 shuffle 模式必须 Kryo,否则报 does not support object relocation
spark.sql.shuffle.partitions按规模设置每 Spark 应用在 Uniffle 侧的 partition 数,影响 shuffle 节点选择与文件数

七、生产配置模板

4 节点集群(1 coordinator 加 3 shuffle-server,每台 64GB 内存,HDFS 存储)参考:

coordinator.conf:

rss.rpc.server.port 19991
rss.jetty.http.port 19990
rss.coordinator.server.heartbeat.timeout 30000
rss.coordinator.app.expired 600000
rss.coordinator.shuffle.nodes.max 3
rss.coordinator.select.partition.strategy CONTINUOUS
rss.coordinator.access.loadChecker.memory.percentage 30.0

shuffle-server.conf(server.conf,每台相同):

rss.rpc.server.port 19997
rss.jetty.http.port 19996
rss.storage.basePath /data1/uniffle/shuffle_data
rss.storage.type MEMORY_LOCALFILE_HDFS
rss.coordinator.quorum coord1:19991,coord2:19991
rss.server.buffer.capacity 16g
rss.server.read.buffer.capacity 8g
rss.server.flush.thread.alive 10
rss.server.flush.localfile.threadPool.size 20
rss.server.flush.hadoop.threadPool.size 60
rss.server.disk.capacity 3t
rss.server.single.buffer.flush.enabled true
rss.server.single.buffer.flush.threshold 64m

rss-env.sh(coordinator 与 server 可分主机分别设置):

JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
HADOOP_HOME=/opt/hadoop
XMX_SIZE="4g"
SHUFFLE_SERVER_XMX_SIZE="32g"

规划原则:buffer.capacity 约为堆上限的一半,HDFS 类型需额外确认 HADOOP_HOME/bin/hadoop classpath 能访问到 hdfs-site.xml(HADOOP_CONF_DIR 在 PATH 内),准入门檻 shuffle.nodes.max 设为集群实际节点数。

八、常见问题

Q1:为什么 coordinator.conf 与 server.conf 都写着 rss.rpc.server.port 19999? 发行包两份默认配置各自独立且值相同,官方假设 coordinator 与 shuffle-server 分机部署。同机部署时必须手工错开,本文采用 coordinator 19991/19990 与 shuffle-server 19997/19996 的组合。

Q2:设置了 rss.coordinator.access.loadChecker.memory.percent 95.0 但不生效。 键名拼写错误,0.10.0 实际读取的键是 rss.coordinator.access.loadChecker.memory.percentage(percentage 结尾)。可通过反汇编 CoordinatorConf 确认 COORDINATOR_ACCESS_LOADCHECKER_MEMORY_PERCENTAGE 对应的键名。

Q3:shuffle-server 配置文件应该叫 shuffle-server.conf 还是 server.conf? 0.10.0 为 conf/server.conf。启动脚本 start-shuffle-server.sh 固定读取 server.conf,旧文件名不会被加载。

Q4:如何验证 JVM 堆参数真的生效? 用 jps -v(或 ps -ef | grep '[j]ava')查看进程参数,输出中应出现 rss-env.sh 设置的 -Xms 与 -Xmx 值,例如 512MB 配置对应 -Xms512m -Xmx512m。

Q5:LOCALFILE 存储类型启动报 should be used in test mode 是 bug 吗? 不是 bug,是 0.10.0 的明确限制:LOCALFILE 与 HDFS 两种直写类型性能不达标,仅允许测试模式使用。验证环境在 server.conf 设 rss.test.mode.enable true,并在 Spark 客户端设 spark.rss.test.mode.enable true;生产使用 MEMORY_LOCALFILE 或 MEMORY_LOCALFILE_HDFS。

九、参考链接