数据湖Iceberg库表治理之 小文件是如何膨胀的?

Iceberg表,每次commit提交时,最终数据以datafile文件形式落地成snapshot。单个snapshot的datafile文件数由 作业Output并发度与表分区决定


Metadata&Datafile 的拓扑图如下


在生产环境中,对于iceberg分区表,为了提高数据写入的output性能,在开启fanout写入模式下

以N个并发度提交包含M个分区的数据块,单次最多可产生N*M个小文件


小文件膨胀会怎么样?

雪崩效应

1、iceberg的小文件过多,下游即席 查询慢

2、iceberg的小文件过多,离线 批加载分析时,spark任务总是超时

从而导致整个dataflow的实效性降低,甚至雪崩失败


如何应对小文件膨胀?

So,我们需要及时进行小文件的优化,核心如下:
1、降低commit频次,满足业务时效性要求即可
2、降低output并发度与表分区,保持单个分区数据量级在 十亿 范围
3、开启rewrite操作(
rewrite_manifests、rewrite_data_files

Ø根据当前表数据分布,配置合理的filter

Ø根据当前hdfs blockSize & iceberg表splitsize 合理配置targetSizeInBytes

Ø根据实际场景适当控制rewrite频次,防止过多消耗资源

rewrite操作的两种模式

  • 编程api模式

  • Procedures模式

Stored procedures are only available when using Iceberg SQL extensions in Spark 3.x.

CALL catalog_name.system.rewrite_manifests('db.sample', false)
CALL catalog_name.system.rewrite_data_files(table => 'db.sample', options => map('min-input-files','2'))

EG:
https://iceberg.apache.org/docs/latest/spark-procedures/#rewrite_manifests

实战优化效果

发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章