Hudi Compaction机制(Inline vs Async)与性能调优
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(独立作业)|