日常iceberg表的生产过程中,会由于各种原因,导致很多orphan 垃圾文件,大量无效的磁盘占用,如:snap expire未完成、多端写入时由于锁竞争失败、rewrite commit失败导致等等
Orphan文件膨胀现象
描述:
由于生产环境要求单表 批流混合写入,亚秒至分钟级别的数据实效性,同时要满足下游 亚秒级 ad-hoc查询与多维分析,所以在多端、亚秒级频繁数据写入的同时,需要并行进行多方表治理工作,eg:小文件rewrite、snap expire,导致单表的commit操作竞争激烈,fail频繁,进而导致orphan 垃圾文件激增
数据冗余分析
从示意图中,可以看出
数据冗余原理
ps:Iceberg有事务特性保证,在保证数据的一致性的前提下,为何还会频繁的失败并有现场残留?与其事务隔离特性、不同的commit类型带来的datafile不同操作以及引擎任务或者作业的稳定性都有关系
如何应对orphan 垃圾文件激增?
So,我们需要定时主动 定期的进行orphan datafiles清理
Orphan datafiles清理操作的两种模式
PS:
Stored procedures are only available when using Iceberg SQL extensions in Spark 3.x.
CALL catalog_name.system.remove_orphan_files(table => 'db.sample', location => 'tablelocation/data')
https://iceberg.apache.org/docs/latest/spark-procedures/#remove_orphan_files
实战优化效果
从示意图可以看出
留言与评论(共有 0 条评论) “” |