Compaction
Compaction用于合并mor表Base和Log文件。
对于Merge-On-Read表,数据使用列式Parquet文件和行式Avro文件存储,更新被记录到增量文件,然后进行同步/异步compaction生成新版本的列式文件。Merge-On-Read表可减少数据摄入延迟,因而进行不阻塞摄入的异步Compaction很有意义。
异步Compaction会进行如下两个步骤
- 调度Compaction:由入湖作业完成,在这一步,Hudi扫描分区并选出待进行compaction的FileSlice,最后CompactionPlan会写入Hudi的Timeline。
- 执行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 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
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不支持和写并发。