Iceberg小文件合并测试

发布时间 2024-01-02 10:32:11作者: 黑水滴

总结

指标
合并前
合并后(因测试中多次合并,数据会偏多)
查询速度 246秒 13秒
表总大小 9.2G 26.4G
单个文件大小 1-25MB 60MB左右
metadata目录文件数 37 75
data目录文件数 900 1501

小文件合并后历史版本数据不会自动清理,需要做快照清理

快照清理参考:Iceberg过期快照清理

 

一、合并前性能统计

1、查询速度(4分钟多)

select count(1) from order_info1;

2、表总大小

hdfs dfs -du -h /user/hive/warehouse/data_lake_ods.db/order_info1


3、单个文件大小例子

4、文件数量

hdfs dfs -du -h /user/hive/warehouse/data_lake_ods.db/order_info1/data

路径:/user/hive/warehouse/data_lake_ods.db/order_info1/data

文件数:900

路径:/user/hive/warehouse/data_lake_ods.db/order_info1/metadata

文件数:37

二、合并任务资源使用情况

1、处理数据表中已删除的数据(仅超1亿大表才执行)

如果是大表,则先执行max-file-group-size-bytes=1处理删除文件。max-concurrent-file-group-rewrites设置为maxExecutors个数最快

CALL iceberg_catalog.system.rewrite_data_files(
table => 'data_lake_ods.order_info1',
options => map(
  'max-concurrent-file-group-rewrites','15',
  'max-file-group-size-bytes','1',
  'rewrite-all','true'
  )
);
 

任务使用的10并行度,单executor执行一个任务,大概20秒左右处理一个数据文件

共计2.8亿条数据表,任务执行时长15分钟左右。

2、开始合并小文件(分组大小1GB,生成文件64MB)

CALL iceberg_catalog.system.rewrite_data_files(
table => 'data_lake_ods.order_info1',
options => map(
  'max-concurrent-file-group-rewrites','15',
  'max-file-group-size-bytes','1073741824',
  'target-file-size-bytes','67108864',
  'rewrite-all','true'
  )
);
 

合并小文件执行时长2分钟左右

 

三、合并后性能统计

1、查询速度(13秒)

2、表总大小(26.4G)

3、单个文件大小例子

4、文件数量

hdfs dfs -du -h /user/hive/warehouse/data_lake_ods.db/order_info1/data

路径:/user/hive/warehouse/data_lake_ods.db/order_info1/data

文件数:1501

路径:/user/hive/warehouse/data_lake_ods.db/order_info1/metadata

文件数:75

 

 

 

 

 

 

 

 

参考文章:

1、Spark 合并 Iceberg 小文件内存溢出问题定位和解决方案

https://xie.infoq.cn/article/50259945d7663d7194a5e2763

2、通过flink、spark优化iceberg表小文件项目

https://github.com/zhuxiaoshang/flink-be-god/blob/master/flink-iceberg/src/main/java/flink/iceberg/compaction/SparkCompaction.java