CodeWalk

Doris Compaction策略详解

作者:苦行僧 · 2026-05-30 12:55

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)