如何配置Hudi Compaction的Spark周期任务?
问题描述
Migration写入数据到Hudi时为了保证稳定性需要将Compaction任务单独拆成Spark作业并交给MRS执行,那么如何进行配置?
解决方案
- 修改Migration实时集成作业配置。
Migration任务中必须关闭异步compaction动作,同时将clean和archive关闭。具体来说,可以在“Hudi表属性全局配置”或单表的“表属性编辑”中配置下表所示参数。
表1 Hudi表参数 参数名
参数值
含义
compaction.schedule.enabled
true
开启compaction计划生成
compaction.delta_commits
60
compaction计划生成的compaction次数触发周期
compaction.async.enabled
false
关闭异步compaction
clean.async.enabled
false
清理历史版本数据文件
hoodie.archive.automatic
false
Hudi commit文件老化的开关
图1 关闭Migration compaction任务
如上配置项配置完成后,作业启动后不再进行compaction任务,只会定期生成compaction计划,Spark SQL作业可以通过“run compaction on”命令执行compaction计划。
compaction计划一定需要Migration任务生成,然后交给Spark执行,否则会有Hudi Timeline的冲突,导致Spark compaction作业执行失败。
- 创建Spark SQL周期性Compaction任务。
- 前往DataArts Studio数据开发界面,参考《开发批处理单任务SQL作业》创建Spark SQL作业。
图2 创建Spark SQL单任务作业
- 配置与Hudi相对应的Spark数据连接,并选中需要操作Hudi表对应的数据库。
图3 配置连接与数据库
- 根据实际情况配置compaction的调度周期。
图4 配置调度周期
- 填写Spark SQL的compaction语句,提交并运行作业。
set hoodie.compact.inline = true; set hoodie.run.compact.only.inline = true; set hoodie.clean.automatic = false; set hoodie.cleaner.commits.retained = 120; set hoodie.keep.min.commits = 121; set hoodie.keep.max.commits = 141; run compaction on `db_name`.`table_name`; run clean on `db_name`.`table_name`; run archivelog on `db_name`.`table_name`;
图5 提交并运行作业
- 前往DataArts Studio数据开发界面,参考《开发批处理单任务SQL作业》创建Spark SQL作业。