更新时间:2026-06-29 GMT+08:00
分享

Hudi Compaction操作说明

操作场景

随着MOR(Merge-On-Read,读时合并)表持续写入更新数据,增量日志文件(Log文件,Avro行式格式)不断累积,查询时需要合并大量Log文件与Base文件(Parquet列存文件),导致查询性能逐渐下降。为解决此问题,Hudi提供Compaction操作,将Log文件与Base文件合并为新的Base文件,从而提升查询性能。Compaction操作分为同步和异步两种执行方式。

Hudi的Compaction操作是用于优化数据文件,用于合并mor表Base和Log文件,来提高查询性能和存储效率。

对于Merge-On-Read表,数据使用列式Parquet文件和行式Avro文件存储,更新被记录到增量文件,然后进行同步/异步compaction生成新版本的列式文件。Merge-On-Read表可减少数据摄入延迟,因而进行不阻塞摄入的异步Compaction很有意义。

执行Compaction

使用Compaction的方式分为同步和异步两种:

同步方式由参数hoodie.compact.inline控制,默认为true,自动生成compaction调度计划并执行compaction:
  • 关闭同步compaction

    datasource写入时可以通过 .option("hoodie.compact.inline", "false") 来关闭自动compaction。

    Spark SQL写入时可以通过set hoodie.compact.inline=false;来关闭自动compaction。

  • 仅同步生成compaction调度而不执行compaction
    • datasource写入时可以通过以下option参数来实现:
      option("hoodie.compact.inline", "true").
      option("hoodie.schedule.compact.only.inline", "true").
      option("hoodie.run.compact.only.inline", "false").
    • Spark SQL写入时可以通过set以下参数来实现:
      set hoodie.compact.inline=true;
      set hoodie.schedule.compact.only.inline=true;
      set hoodie.run.compact.only.inline=false;
异步Compaction会进行如下两个步骤:
  1. 调度Compaction:由入湖作业完成,在这一步,Hudi扫描分区并选出待进行compaction的FileSlice,最后CompactionPlan会写入Hudi的Timeline。
  2. 执行Compaction:一个单独的进程/线程将读取CompactionPlan并对FileSlice执行Compaction操作。

异步方式由Spark SQL来实现,具体请参考COMPACTION章节。

如果需要在异步compaction时只执行已经产生的compaction调度计划而不创建新的调度计划,则需要通过set命令设置以下参数:

set hoodie.compact.inline=true;
set hoodie.schedule.compact.only.inline=false;
set hoodie.run.compact.only.inline=true;

更多compaction参数请参考compaction&cleaning配置章节。

为了保证入湖的最高效率,推荐使用同步产生compaction调度计划,异步执行compaction调度计划的方式。

相关文档