选择合适的表服务执行方式
方式一:表服务与写任务一起执行
严格按照模板执行,不允许删除/增加/修改其中的参数。
- insert overwrite场景。
- 此场景不管是cow表还是mor表,都只需要做clean和archive,不需要做compaction。
- 推荐直接用cow表。
按照下面这个模板直接使用:
set hoodie.cleaner.commits.retained = 5; // clean默认是开启的,insert overwrite场景clean保留的版本数不能太多,设置为5已足够。 set hoodie.keep.min.commits = 6; // archive默认是开启的,archive最少保留的元数据个数比clean保留的版本数多就可以。 set hoodie.keep.max.commits = 7; // archive最大保留的元数据个数 insert overwrite SinkTable select * from SourceTable;
- insert into场景。
- cow表:
- mor表:
insert into场景,只需要考虑compaction的触发频率。
set hoodie.compact.inline.max.delta.commits = X; // 参数默认值是5。业务侧要考虑往Hudi表写入X次所追加的log文件的大小,控制log文件的大小在300M以内性能最佳。举例,写入10次之后log文件的大小为500M,如果想控制log文件的大小在100M,可以粗略设置该参数的值为100/(500/10)=2。 set hoodie.cleaner.commits.retained = X + 1; set hoodie.keep.min.commits = X + 10; set hoodie.keep.max.commits = X + 20; insert into SinkTable select * from SourceTable;
方式二:表服务与写任务分开执行
严格按照模板执行,不允许删除/增加/修改其中的参数
- 写任务中配置。
- cow表:
直接使用方式一:表服务与写任务一起执行。
- mor表:
set hoodie.compact.inline = true; set hoodie.schedule.compact.only.inline=true; set hoodie.compact.inline.max.delta.commits = X; // 参数默认值是5。业务侧要考虑往Hudi表写入X次所追加的log文件的大小,控制log文件的大小在300M以内性能最佳。举例,X值当前是10,写入10次之后log文件的大小为500M,如果想控制log文件的大小在100M,可以粗略设置该参数的值为100/(500/10)=2。 set hoodie.clean.automatic = false; set hoodie.archive.automatic = false; insert into SinkTable select * from SourceTable;
- cow表:
- 异步脚本执行表服务。
该异步脚本通常需要在DGC平台上进行定时调度,对读性能要求比较高建议1小时调度一次,其它可以设置为2~4小时调度一次。
mor表:set hoodie.clean.automatic = false; set hoodie.clean.async = false; set hoodie.archive.automatic = false; set hoodie.archive.async = false; set hoodie.compact.inline = true; set hoodie.run.compact.only.inline = true; set hoodie.cleaner.commits.retained = X + 1; set hoodie.keep.min.commits = X + 10; set hoodie.keep.max.commits = X + 20; run compaction on <database name>. <table name>; -- 执行Compaction计划 run clean on <database name>. <table name>; -- 执行Clean操作 run archivelog on <database name>.<table name>; -- 执行Archive操作
表服务选择技巧
- 只要是cow表,选择方式一:表服务与写任务一起执行。
- 只要是insert overwrite写入,无论是cow表还是mor表,选择方式一:表服务与写任务一起执行。
- mor表使用insert into方式写入,如果业务可以接受mor表在写入X次之后因触发了compaction/clean/archive而导致任务时常比平时至少增加1~2倍,则可以选择方式一:表服务与写任务一起执行;否则,选择方式二:表服务与写任务分开执行。
- spark/flink streaming场景,选择方式二:表服务与写任务分开执行。