Compaction Service 是 EMR Serverless StarRocks 3.5 版本引入的新功能(目前处于 Beta 阶段),将 Compaction 任务从业务所在计算组中独立出来,运行在专用的 Compaction Service 上,实现工作负载隔离、弹性伸缩和性能优化。本文介绍 Compaction Service 的功能及使用方法。
功能概述
核心价值
|
能力 |
说明 |
|
Workload 隔离 |
Compaction 在独立的 Service 上执行,避免与查询、导入等业务任务争抢资源,保障业务稳定性。 |
|
弹性伸缩 |
Compaction Service 支持设置 Min CU / Max CU,根据 Compaction 负载自动弹缩,在保障 Compaction 及时性的同时降低成本。 |
|
开箱即用 |
3.5 版本自动创建 Compaction Service,用户只需在控制台一键开启,无需额外选购或配置。 |
性能优化
Compaction Service 在隔离的基础上进行了以下性能优化:
-
Peer Cache 读取:Compaction 任务执行时,直接从业务所属计算组中有缓存的节点拉取数据(Peer Cache),避免访问对象存储(Remote I/O),显著提升 Compaction 读取性能。
-
Cache 推送:Compaction 完成后,Compaction Service 将合并后的数据文件异步推送到业务所属计算组的节点上,避免因缓存失效(Cache Miss)导致的对象存储访问,保障查询性能不受影响。
前提条件
-
EMR Serverless StarRocks 版本 >= 3.5。
-
存算分离模式集群。
开启 Compaction Service
在 EMR Serverless StarRocks 控制台上,执行以下步骤开启 Compaction Service:
-
进入EMR Serverless StarRocks实例列表页面。
-
在左侧导航栏,选择。
-
在顶部菜单栏处,根据实际情况选择地域。
-
单击目标实例ID。
-
单击 Compaction Service 页签,在基本信息页面,单击启动服务。
-
在右侧弹出的页面设置,最小 CU和最大 CU。
-
配置完成后,单击启动服务。
关闭 Compaction Service
在控制台中单击关闭服务后,右侧弹出的页面中请勾选风险确认选项,然后单击确认关闭服务即可。关闭后,Compaction 将回退到在业务所属计算组上执行,已在执行的任务会正常完成。
弹性伸缩
CU 配置
Compaction Service 支持设置弹性伸缩范围:
|
参数 |
说明 |
建议 |
|
最小 CU |
最小计算单元数,空闲时缩容至此值。 |
建议设置为满足基础 Compaction 需求的最小值。 |
|
最大 CU |
最大计算单元数,高峰时扩容至此值。 |
根据业务写入峰值和 Compaction Score 情况设置。 |
弹缩策略
Compaction Service 根据以下指标自动弹缩:
-
Compaction Score:反映数据版本堆积程度,Score 越高说明 Compaction 压力越大。
-
任务负载:当前 Compaction 任务数量与可用资源的比例。
当 Compaction Score 持续升高或任务排队时,系统自动扩容;当负载降低后,系统逐步缩容至 Min CU。
最佳实践
推荐在以下场景中使用 Compaction Service:
-
高写入吞吐场景:持续高频写入导致 Compaction Score 上升,影响查询性能。
-
查询敏感场景:业务对查询延迟敏感,不希望 Compaction 抢占查询资源。
-
成本优化场景:希望通过弹性伸缩按需使用 Compaction 资源,降低常驻成本。
注意事项
-
Compaction Service 仅适用于存算分离(Shared-Data)模式的集群。
-
开启 Compaction Service 后,所有表的 Compaction 任务将统一调度到 Compaction Service 执行。
-
Compaction Service 的 CU 资源独立按使用量计费,请合理配置 Min/Max CU。
-
关闭 Compaction Service 后,Compaction 将自动回退到各业务所属计算组上执行,已在执行的任务会正常完成。
-
建议在业务低峰期首次开启 Compaction Service,以便观察对系统的影响。
常见问题与调优
Compaction 耗时过长或新增节点未参与任务
当 Compaction 任务执行缓慢或新增的 CN 节点未被分配 Compaction 任务时,可按以下步骤排查和调优。
排查步骤
-
确认节点状态。
执行以下 SQL 查看当前所有 CN 节点及其状态,确认新增节点是否已正常加入集群并处于
Alive状态。SHOW COMPUTE NODES; -
查看 Compaction 任务状态。
执行以下 SQL 查看当前正在执行的 Compaction 事务及任务分布情况。
SHOW PROC '/compactions'; -
查看详细任务信息。
查询
information_schema.be_cloud_native_compactions表获取每个 Compaction 任务的详细信息,包括执行节点、任务耗时等。SELECT * FROM information_schema.be_cloud_native_compactions;
参数调优
如果确认节点正常但 Compaction 仍然缓慢,可调整以下 BE 配置参数:
|
参数 |
说明 |
建议值 |
|
|
Compaction 并发线程数,增大可提升并行处理能力。 |
调整为 8 |
|
|
单次 Cumulative Compaction 最大可合并的数据版本数,增大可加速小版本合并。 |
调整为 100 |
小文件过多导致合并失败或内存打满
当数据写入频率过高或分桶策略不合理时,可能导致大量小文件堆积,进而引发 Compaction 合并失败或 CN 节点内存打满。
应急处理
-
增加弹性节点,缓解内存压力。
-
临时降低导入频率或暂停导入任务,让系统优先完成存量数据的 Compaction。
参数调优
调整以下参数加速合并:
|
参数 |
说明 |
建议值 |
|
|
Compaction 并发线程数。 |
调整为 8 |
|
|
单次 Cumulative Compaction 最大可合并的版本数。 |
调整为 300 |
|
|
Primary Key 表 Compaction 最大输入 Rowset 数。 |
调整为 300 |
长期优化
-
调整分桶策略,确保数据在各分桶间均匀分布。
-
单个分桶的数据量建议不超过 5 GB。
Compaction 预警处理
收到 Compaction 预警时,说明数据版本堆积速度超过了合并速度,需要从降低写入频率和加速合并两个方向优化。
优化措施
-
调整导入任务为攒批模式,减少写入频率。
-
调整以下参数:
-
base_compaction_check_interval_seconds:Base Compaction 检查间隔,适当调大可降低检查频率,减少资源消耗。建议从默认 60 秒调整为 600 秒。 -
max_cumulative_compaction_num_singleton_deltas:单次 Cumulative Compaction 最大可合并版本数,调大可加速小版本合并。建议适当调大。
-
-
优化分桶数。对于小表,建议设置 8~10 个 Bucket。
-
使用以下 SQL 监控 Compaction 状态,观察调优效果。
SHOW PROC '/compactions';
高内存水位下调整 Compaction 线程数的风险提示
在 CN 节点内存水位较高(例如已达 80%)时调整 compact_threads 参数,需注意以下事项:
-
调整前评估 CPU 和内存的实际负载情况。
-
建议在资源有余量时逐步调整,例如从 4 调至 8,观察系统稳定性后再决定是否继续调大。
-
避免在内存水位已经很高时大幅增加线程数,否则可能引发 OOM(Out of Memory)风险。