更新时间:2022-12-14 GMT+08:00

Compaction

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

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

异步Compaction会进行如下两个步骤

  1. 调度Compaction:由入湖作业完成,在这一步,Hudi扫描分区并选出待进行compaction的FileSlice,最后CompactionPlan会写入Hudi的Timeline。
  2. 执行Compaction:一个单独的进程/线程将读取CompactionPlan并对FileSlice执行Compaction操作。

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

同步方式包括:

  • 在使用HoodieDeltaStreamer将上游(Kafka/DFS)数据写入 hudi数据集时参数--disable-compaction默认为false,自动进行compaction操作。
  • 使用datasource在写入时指定参数:

    option("hoodie.compact.inline", "true").

    option("hoodie.compact.inline.max.delta.commits", "2").

异步方式包括

  • 使用hudi-cli进行异步compaction

    调度compaction:

    compaction schedule --hoodieConfigs 'hoodie.compaction.strategy=org.apache.hudi.table.action.compact.strategy.BoundedIOCompactionStrategy,hoodie.compaction.target.io=1,hoodie.compact.inline.max.delta.commits=1'

    执行compaction:

    compaction run --parallelism 100 --sparkMemory 1g --retry 1 --compactionInstant 20210602101315 --hoodieConfigs 'hoodie.compaction.strategy=org.apache.hudi.table.action.compact.strategy.BoundedIOCompactionStrategy,hoodie.compaction.target.io=1,hoodie.compact.inline.max.delta.commits=1' --propsFilePath hdfs://hacluster/tmp/default/tb_test_mor/.hoodie/hoodie.properties --schemaFilePath /tmp/default/tb_test_mor/.hoodie/compact_tb_base.json

  • 使用API进行异步compaction

    调度compaction:

    spark-submit --master yarn --jars /opt/client/Hudi/hudi/lib/hudi-client-common-xxx.jar --class org.apache.hudi.utilities.HoodieCompactor /opt/client/Hudi/hudi/lib/hudi-utilities_xxx.jar --base-path /tmp/default/tb_test_mor --table-name tb_test_mor --parallelism 100 --spark-memory 1G --schema-file /tmp/default/tb_test_mor/.hoodie/compact_tb_base.json --instant-time 20210602141810 --schedule --strategy org.apache.hudi.table.action.compact.strategy.UnBoundedCompactionStrategy

    执行compaction:

    spark-submit --master yarn --jars /opt/client/Hudi/hudi/lib/hudi-client-common-xxx.jar --class org.apache.hudi.utilities.HoodieCompactor /opt/client/Hudi/hudi/lib/hudi-utilities_xxx.jar --base-path /tmp/default/tb_test_mor --table-name tb_test_mor --parallelism 100 --spark-memory 1G --schema-file /tmp/default/tb_test_mor/.hoodie/compact_tb_base.json --instant-time 20210602141810
    • 使用hudi-cli进行调度compaction时,不需要指定instant-time,系统会自动生成并在调度成功后返回,只需在执行时传入该参数即可。
    • schema-file需要用户手动编辑当前Hudi表的表结构schema文件上传到服务器上(可以使用最近一次“.commit”文件中的schema)。
    • compaction不支持和写并发。