更新时间:2024-11-29 GMT+08:00

Compaction

Compaction简介

Compaction用于合并mor表Base和Log文件。

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

使用Compaction

Compaction包含两个步骤:
  1. 生成Compaction调度计划:Hudi扫描分区并选出待进行compaction的FileSlice,然后CompactionPlan写入Hudi的Timeline。
  2. 执行Compaction计划:读取CompactionPlan并对FileSlice执行Compaction操作。
使用Compaction的方式分为同步和异步两种,由参数hoodie.compact.inline控制,默认为true:
  • 同步方式,自动生成compaction调度计划并执行compaction:
    1. 关闭同步compaction

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

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

    2. 仅同步生成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;

  • 异步方式由spark-sql来实现。

    如果需要在异步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调度计划的方式。