Doris Compaction策略详解
Apache Doris的Compaction机制是如何工作的?请说明Base Compaction和Cumulative Compaction的区别和触发条件、Compaction策略选择(Size-tiered vs Time-series)、以及如何优化Compaction性能。如何处理Compaction失败和积压问题?
回答
苦行僧
1. Compaction概述
Doris采用**分层合并(Tiered Compaction)**策略:
写入数据 → Version生成 → Cumulative Compaction
↓
Base Compaction(最终合并)
2. Compaction类型
Cumulative Compaction(增量合并)
- 合并较小的Version
- 目标:减少小文件数
- 触发条件:
- 单分区Version数 > 10(默认)
- 或Version总体积 > 1GB
- 输出:Cumulative文件
Base Compaction(基础合并)
- 合并Cumulative文件 + Base文件
- 目标:生成最终全量数据文件
- 触发条件:
- Cumulative文件总大小 > Base文件大小 * 0.3
- 或自上次Base Compaction超过24小时
3. 策略选择
| 策略 | 适用场景 | 特点 |
|---|---|---|
| Size-tiered | 通用 | 相近大小的文件合并 |
| Time-series | 时序数据 | 按时间列优先合并 |
4. 配置优化
# be.conf
# Compaction线程数
compaction_task_num_per_disk = 4
# 大文件合并阈值
max_base_compaction_num_cumulative_files = 20
# 合并超时(秒)
max_compaction_time_s = 3600
# 是否动态调整
enable_single_replica_compaction = true
5. Compaction失败处理
-- 查看Compaction状态
SHOW PROC "/compactions";
-- 手动触发Compaction
ALTER TABLE t1 COMPACTION;
-- 排查失败原因
SHOW ROUTINE LOAD; -- 检查负载
常见失败原因:
- 磁盘空间不足
- 内存不足(OOM)
- 文件损坏
6. 积压优化方案
- 增加Compaction线程(
compaction_task_num_per_disk) - 减少写入频率(批量写入)
- 调整
cumulative_compaction_budgeted_bytes - 分区分桶策略优化(减少单分区数据量)
- 开启 Segment Compaction(合并小Segment)