配置Hudi历史数据清理
操作场景
随着时间的推移,Hudi表中的数据越来越多,表中的老数据价值逐渐变弱,并且还会占用大量的存储空间。为了有效管理存储资源并节约成本,Hudi需要支持对这些老数据的删除操作。
约束与限制
本章节仅适用于MRS 3.3.0-LTS及之后版本。
delete/drop partition语句直接删除历史数据
delete/drop partition命令可以用来清理历史数据:
- delete语句用于删除表中的特定记录。在Hudi中,可以通过指定条件来删除符合条件的数据。例如,可以删除某个时间范围内的数据或特定分区的数据。
- drop partition语句用于删除表中的特定分区。分区是Hudi表中的一种组织方式,可以显著提高查询性能和数据管理的效率。通过删除分区,可以快速释放存储空间。
优点:操作简单,支持cow表和mor表。
缺点:并发能力不足。 当Hudi表处于实时写入状态,并发执行delete/drop partition命令容易导致实时入库作业失败。
delete/drop partition语句的使用具体可以参考DELETE和Drop Partition章节。
call clean_data命令删除历史数据
call clean_data命令主要用于清理表中的旧数据文件,包括已删除的数据和过期的文件版本。通过定期执行call clean_data,可以确保Hudi表的高效运行和存储优化。在执行call clean_data之前,建议先备份重要数据,以防止误操作导致数据丢失。
- 命令功能
call clean_data的功能是用来删除mor表的历史数据。
优点:可以和入库任务并发执行,不会影响实时入库数据。
缺点:只支持mor表,并且是惰性删除,依赖于compaction。
- 命令格式
call clean_data(table => 'table_name', sql => 'delete statement')
- 参数描述
表1 参数描述 参数
描述
table_name
待删除数据的Hudi表名称,支持database.tablename格式。
delete statement
select类型的sql语句,用于找出待删除的数据。
- 示例
从mytable表中删除primaryKey < 100 的所有数据:
call clean_data(table => 'mytable', sql=>'select * from mytable where primaryKey < 100')
清理上次clean_data命令残留文件;cleanData执行失败会产生临时文件,该命令可以清理这些临时文件:
call clean_data(table => 'mytable', sql=>'delete cleanData')
- 系统响应