CodeWalk

Hudi Compaction机制(Inline vs Async)与性能调优

作者:我是大山 · 2026-05-30 12:55

Hudi的Compaction机制如何合并MOR表的Base File和Log File?请解释Inline Compaction(同步合并)和Async Compaction(异步合并)的区别,以及各自的适用场景。给出一个生产环境中Compaction策略的配置示例,说明如何平衡写入延迟和读取性能。

回答

我是大山

Hudi Compaction(MOR表合并)详解:

1. Compaction是什么

  • MOR表写入时,更新追加到Log File(Avro格式)
  • 读取时需合并Base File(Parquet)+ Log File
  • Compaction将Log合并回Base File,生成新Base File

2. Inline Compaction(同步合并)

// Spark写入时同步合并
df.write.format("hudi")
  .option("hoodie.compact.inline", "true")
  .option("hoodie.compact.inline.max.delta.commits", "5")
  .mode(Append)
  .save("/path");
  • 特点:写入任务中直接执行Compaction
  • 优点:简单,不需要额外资源
  • 缺点:增加写入延迟,可能影响写入吞吐

3. Async Compaction(异步合并)

# 写入时只生成Compaction Plan
hoodie.compact.inline: false
hoodie.compact.schedule.inline: true        # 写入时生成计划

# 独立Spark作业执行Compaction
hoodie.compact.async.enable: true
hoodie.compact.async.max.delta.commits: 5  # 每5次commit触发一次
# 异步Compaction作业
spark-submit --class org.apache.hudi.utilities.HoodieCompactor \
  --conf 'spark.serializer=org.apache.spark.serializer.KryoSerializer' \
  ...
  • 特点:独立Spark作业执行
  • 优点:不影响写入延迟
  • 缺点:需要额外资源

4. 性能调优配置

# Compaction策略
hoodie.compact.strategy: org.apache.hudi.table.action.compact.strategy.LogFileSizeBasedCompactionStrategy
hoodie.compact.logFile.size.threshold: 256MB        # Log文件超256MB触发
hoodie.compact.max.delta.commits: 5                  # 每5次commit
hoodie.compact.min.delta.commits: 3                  # 最少3次commit
hoodie.compact.target.io: 500 * 1024 * 1024          # Compaction IO预算500MB
hoodie.parquet.compression.codec: snappy

5. 选型建议: | 场景 | 推荐 | |------|------| | 写入延迟敏感 | Async Compaction | | 读取一致性要求高 | Inline Compaction | | 写入吞吐优先 | Async + 加大Log阈值 | | 资源充裕 | Async(独立作业)|