总结

指标
合并前
合并后(因测试中多次合并,数据会偏多)
查询速度 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大宽表直接合并:
CALL spark_catalog.system.rewrite_data_files(
table => 'data_lake_ods.order_info1',
options => map(
'partial-progress.enabled', 'true',
'rewrite-job-order', 'bytes-asc',
'partial-progress.max-commits', '10000',
'max-file-group-size-bytes', '1073741824',
'rewrite-all','true'
)
);

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

官网文档:https://iceberg.apache.org/docs/latest/spark-procedures/

其它优化参数

1)rewrite-job-order=bytes-asc
说明:根据该值强制指定重写作业顺序
    bytes-asc:则首先重写最小的作业组。
    bytes-desc:则首先重写最大的作业组。
    files-asc:则首先重写文件最少的作业组。
    files-desc:则首先重写文件最多的作业组。
    none(默认):则按照计划的顺序重写作业组(无特定顺序)。
2)target-file-size-bytes
说明:目标输出文件大小
默认值:536870912512 MB)
可以修改成:67108864(64MB)

三、合并后性能统计

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

表治理-Iceberg小文件合并测试的更多相关文章

  1. iceberg合并小文件冲突测试

    基于iceberg的master分支的9b6b5e0d2(2022-2-9). 参数说明 1.PARTIAL_PROGRESS_ENABLED(partial-progress.enabled) 默认 ...

  2. hive小文件合并设置参数

    Hive的后端存储是HDFS,它对大文件的处理是非常高效的,如果合理配置文件系统的块大小,NameNode可以支持很大的数据量.但是在数据仓库中,越是上层的表其汇总程度就越高,数据量也就越小.而且这些 ...

  3. Hadoop经典案例(排序&Join&topk&小文件合并)

    ①自定义按某列排序,二次排序 writablecomparable中的compareto方法 ②topk a利用treemap,缺点:map中的key不允许重复:https://blog.csdn.n ...

  4. Hive merge(小文件合并)

    当Hive的输入由非常多个小文件组成时.假设不涉及文件合并的话.那么每一个小文件都会启动一个map task. 假设文件过小.以至于map任务启动和初始化的时间大于逻辑处理的时间,会造成资源浪费.甚至 ...

  5. Hadoop MapReduce编程 API入门系列之小文件合并(二十九)

    不多说,直接上代码. Hadoop 自身提供了几种机制来解决相关的问题,包括HAR,SequeueFile和CombineFileInputFormat. Hadoop 自身提供的几种小文件合并机制 ...

  6. HDFS操作及小文件合并

    小文件合并是针对文件上传到HDFS之前 这些文件夹里面都是小文件 参考代码 package com.gong.hadoop2; import java.io.IOException; import j ...

  7. MR案例:小文件合并SequeceFile

    SequeceFile是Hadoop API提供的一种二进制文件支持.这种二进制文件直接将<key, value>对序列化到文件中.可以使用这种文件对小文件合并,即将文件名作为key,文件 ...

  8. 第3节 mapreduce高级:5、6、通过inputformat实现小文件合并成为sequenceFile格式

    1.1 需求 无论hdfs还是mapreduce,对于小文件都有损效率,实践中,又难免面临处理大量小文件的场景,此时,就需要有相应解决方案 1.2 分析 小文件的优化无非以下几种方式: 1.  在数据 ...

  9. hive优化之小文件合并

    文件数目过多,会给HDFS带来压力,并且会影响处理效率,可以通过合并Map和Reduce的结果文件来消除这样的影响: set hive.merge.mapfiles = true ##在 map on ...

  10. Hadoop实战项目:小文件合并

    项目背景 在实际项目中,输入数据往往是由许多小文件组成,这里的小文件是指小于HDFS系统Block大小的文件(默认128M),早期的版本所定义的小文件是64M,这里的hadoop-2.2.0所定义的小 ...

随机推荐

  1. java 中的Unsafe

    在阅读AtomicInteger的源码时,看到了这个类:sum.msic.Unsafe,之前从没见过.所以花了点时间google了一下. Unsafe的源码:http://www.docjar.com ...

  2. seldom-platform:颠覆传统的自动化测试平台

    seldom-platform:颠覆传统的自动化测试平台 seldom-platform是一个自动化测试平台,其特点是让会写代码的测试人员能够通过seldom框架高效地完成自动化用例的编写,并将剩下的 ...

  3. electron项目icon显示异常

    前情 公司有个桌面端项目是基于Electron开发的. 坑 构建打包好的项目在桌面和任务栏上图标显示正常,但是在任务栏弹框上左上角的图标确不显示 Why? 经过反复搜索,网上有文章说如果ico图标过大 ...

  4. new Date()在ios下的坑

    坑位 最新在开发一个时间轴功能,在使用new Date()的时候发现在IOS下全是NaN. Why new Date("2018-04-27 11:11")在chrome,fire ...

  5. Mysql之myisam引擎

    这里是早起整理的myisam优势,因为当时刚毕业那会web1.0时代还没过时,很多的门户网站实际上就只是内容展示的时候,或者发布文章公告的场景.所以对于这样的读多写少的场景,大多数使用的还是myisa ...

  6. QT日志类SimpleQtLogger的简单记录

    在现代软件开发中,日志记录是必不可少的部分.它不仅帮助开发者在调试和维护软件时了解程序的运行状态,还能提供关键的错误信息.对于使用Qt框架开发应用程序的开发者来说,选择一个合适的日志库至关重要.本文将 ...

  7. 鸿蒙UI开发快速入门 —— part09: 应用级状态管理LocalStorage & AppStorage

    1.说在前面的话 前面几个章节中介绍的装饰器(@State.@Props.@Link.@Provide.@Consume.@Observed.@ObjectLink)仅能在页面内,即一个组件树上共享状 ...

  8. 如何在Linux上使用pbcopy和pbpaste命令

    由于 Linux 和 Mac OS X 是基于 *Nix 的系统,因此许多命令可以在两个平台上运行.但是,某些命令可能在两个平台上都没有,比如 pbcopy 和 pbpast.这些命令仅在 Mac O ...

  9. Solution Set -「NOIP Simu.」20221113

    \(\mathscr{A}\sim\) 游戏   Cover:「ARC 087E」Prefix-free Game.   Tags:「A.博弈-SG 函数」「A.数据结构-Trie」   想了半天 ( ...

  10. manim边做边学--动画更新

    今天介绍Manim中用于动画更新的3个类,分别是: UpdateFromFunc:根据自定义的函数来动态更新 Mobject 的属性 UpdateFromAlphaFunc:根据动画的进度来平滑地改变 ...