Hudi的OverwriteNonDefaultsWithLatestAvroPayload效果测试

发布时间 2023-05-30 10:50:00作者: -见

设置 Payload 为 OverwriteNonDefaultsWithLatestAvroPayload:

set `hoodie.datasource.write.payload.class`=`org.apache.hudi.common.model.OverwriteNonDefaultsWithLatestAvroPayload`;

插入和查询语句:

insert into t71 (ds,ut,pk,f0) values (20230101,CURRENT_TIMESTAMP,1001,1);
select * from t71 where pk=1001; -- 第 1 次查询

insert into t71 (ds,ut,pk,f1) values (20230101,CURRENT_TIMESTAMP,1001,2);
select * from t71 where pk=1001; -- 第 2 次查询

insert into t71 (ds,ut,pk,f2) values (20230101,CURRENT_TIMESTAMP,1001,3);
select * from t71 where pk=1001; -- 第 3 次查询

第 1 次查询的结果:

_hoodie_partition_path  _hoodie_file_name	                                                      ut                       pk    f0   f1   f2
ds=20230101             00000001-1521-41de-94a3-96b0b8f4a54f-0_1-21-19_20230529124148552.parquet  2023-05-29 12:41:48.74   1001  1    NULL NULL

第 2 次查询的结果:

_hoodie_partition_path  _hoodie_file_name	                                                      ut                       pk    f0   f1   f2
ds=20230101             00000001-1521-41de-94a3-96b0b8f4a54f-0                                    2023-05-29 12:46:11.696  1001  1    2    NULL

第 3 次查询的结果:

_hoodie_partition_path  _hoodie_file_name	                                                      ut                       pk    f0   f1   f2
ds=20230101             00000001-1521-41de-94a3-96b0b8f4a54f-0                                    2023-05-29 12:50:30.234  1001  1    NULL 3

从上测试可以看到第 3 次的插入覆盖了第 2 次的插入,原因是第 2 次的结果还没有落地形成 basefile(基础文件,即 parquet 列式文件),还处于 logfile 状态(日志文件,即行式的 avro 文件),基于 precombine 覆盖了。

Compaction

Hudi 的 MOR 表由列式 Parquet 文件和行式 Avro 文件构成,其中 Avro 是新写入的,为 logfile,而 Parquet 是存储已有的,为 basefile,注意对于 COW 表只有 basefile。如果 Avro 文件过多,查询性能受到的影响就大,通过 compaction 合并 Avro 文件降低影响。

Compaction 又分为两步:调度(schedule)和执行(run)。调度的目的是通过扫描分区,找出要合并的 fileslices,将 compaction 计划写入时间轴(timeline);执行这步读取 compaction 计划和合并 fileslices。

使用 Compaction 分为同步和离线两种:

  • 同步 Compaction 设置
hoodie.compact.inline=true
hoodie.compact.inline.max.delta.commits=2
  • 离线 Compaction 设置
hoodie.compact.inline=false
hoodie.compact.inline.max.delta.commits=2

离线方式,建议设置 compaction.schedule.enable 为 true,开启由写任务(write task)定期(periodically)触发执行。

基础文件(basefile)

基础文件为列式格式(如 Parquet 或 Orc,默认为 Parquet)的记录集,对于 COW 表只有基础文件。

日志文件(logfile)

日志文件包含了针对基础文件的插入(inserts)、更新(updates)和删除(deletes)数据,日志文件仅 MOR 表有。

_hoodie_file_name

存储记录的文件名。