目录

  • 1. 过期snapshots的处理
  • 2. 删除老的metadata files
  • 3. 删除孤立的文件
  • 4. 合并data files
  • 5. Rewrite manifests

1. 过期snapshots的处理

Iceberg表每一次write都会产生一个新的snapshot,同时也会产生一个新的version版本。所以对于流式写入,会产生大量的snapshot。因此需要将老的snapshot标记为过期。这样新生成的vN.metadata.json文件,就不会包含过期的snapshot

当一个data file没有被snapshot引用时,就会被删除

下面是一个Java/Scala API示例,对一天前的snapshots标记为过期

    import org.apache.iceberg.Tableval timestampToExpire:Long = System.currentTimeMillis() - (1000L * 60 * 60 * 24)  // 一天val table:Table = nulltable.expireSnapshots().expireOlderThan(timestampToExpire)// .commit()

如果想并行进行处理,可以使用Spark API,示例程序如下:

    val table:Table = ...SparkActions.get().expireSnapshots(table).expireOlderThan(timestampToExpire).execute()

2. 删除老的metadata files

Iceberg表每一次write都会产生一个新的snapshot,同时也会产生一个新的version版本。所以对于流式写入,会产生大量的snapshot。

为了保证原子性,每一个对表产生改变的操作commit后,都会产生一份新的metadata files,这包括一个vN.metadata.json + 一个manifest list(例如:snap-242516093407225541-1-4bbf0565-406b-428a-aad7-e32993df0fef.avro) + 一个或多个manifest file(例如:4bbf0565-406b-428a-aad7-e32993df0fef-mN.avro)

所以对于流式写入,会产生大量的metadata files。所以需要给表设置属性write.metadata.delete-after-commit.enabled=truewrite.metadata.previous-versions-max。参数具体含义参考Iceberg数据湖的Table、Catalog、Hadoop配置Configuration

这样当每次对表产生改变的操作commit后,都会自动删除老的metadata files,只保留指定版本数量的metadata files

3. 删除孤立的文件

产生孤立文件的原因

  1. 有的时候计算引擎执行任务失败,会产生一些不被vN.metadata.json引用的data和metadata files。
  2. 有时标记snapshot为过期,需要删除一些没有被任何snapshot引用的data files。可能无法确定该data files是否被snapshots引用,所以造成本来应该删除的data files,没有被删除

删除孤立文件的方法

Java/Scala API暂时未发现执行方法。使用Spark API进行并行处理

先在pom.xml中添加依赖:

        <dependency><groupId>org.apache.avro</groupId><artifactId>avro</artifactId><version>1.10.2</version></dependency><dependency><groupId>org.apache.iceberg</groupId><artifactId>iceberg-spark3</artifactId><version>0.13.1</version></dependency>

编写示例程序如下:

    val table:Table = ......val spark:SparkSession = ......SparkActions.get().deleteOrphanFiles(table)// 默认只会删除3天前的孤立文件,测试的时候可以手动指定时间// .olderThan(System.currentTimeMillis()).execute()

然后通过spark-submit进行Spark任务的提交

注意事项
可能表下面有许多data和metadata files需要被删除,会花费大量的时间,所以不要频繁进行孤立文件的删除

有时一个write操作可能会花费很长的时间,比如一天。在这期间就会产生很多被认为是孤立的文件。所以孤立文件的保留时间要大于write的时间,默认是3天

在一些文件系统,一份文件的路径相关属性发生改变,就会被误认为是孤立文件而被删除。例如在HDFS中,将一个data file的权限进行修改,该data file可能不能和其他metadata file进行关联,就被误认为是孤立文件而被删除

4. 合并data files

data files的数量越多,则需要储存更多的metadata到manifest files;而且读取数据时,打开一个data file也需要成本。所以需要将小的data files,合并成大的data files。Iceberg利用files metadata table检查data files的文件大小,并进行data files的合并

Java/Scala API暂时未发现执行方法。使用Spark API进行并行处理,示例程序如下:

    val table:Table = ...SparkActions.get().rewriteDataFiles(table).filter(Expressions.equal("birthday", "2022-03-01")).option("target-file-size-bytes", Long.toString(500 * 1024 * 1024)) // 500 MB.execute()

5. Rewrite manifests

metadata files的数量越多,则需要储存更多的metadata到manifest list;而且查询时,打开一个metadata file也需要成本。所以需要将小的metadata files,合并成大的metadata files

下面是通过Java/Scala API,进行Rewrite manifests的一个示例

    import org.apache.iceberg.Tableval table:Table = nulltable.rewriteManifests().rewriteIf(file => file.length() < 10L * 1024 * 1024)    // 10MB// .commit()

如果使用Spark API进行并行处理,示例程序如下:

    val table:Table = ...SparkActions.get().rewriteManifests(table).rewriteIf(file -> file.length() < 10 * 1024 * 1024)  // 10 MB.execute()

Iceberg删除过期snapshots、老的metadata files、孤立的文件,合并data files和manifests相关推荐

  1. Mysql孤儿文件_PostgreSQL中的孤儿文件(orphaned data files)

    创建一个测试表 postgres=# create table t1(a int); CREATE TABLE postgres=# select pg_relation_filepath('t1') ...

  2. 【Iceberg表规范】Manifests(manifest files)、Snapshots和Table Metadata

    目录 1. Manifests(manifest files) 2. Snapshots 2.1 Manifest List 2.2 Scan Planning 2.3 Snapshot Refere ...

  3. Spark与Iceberg整合查询操作-查询快照,表历史,data files Manifests 查询快照,时间戳数据...

    1.8.6 Spark与Iceberg整合查询操作 1.8.6.1 DataFrame API加载Iceberg中的数据 Spark操作Iceberg不仅可以使用SQL方式查询Iceberg中的数据, ...

  4. 批处理实现自动删除过期文件的定期操作

    工作需要,每固定周期需要登录服务器固定目录删除过期日志文件,无奈想了如下批处理(可以通过任务计划 定期执行)的办法实现: 执行后会在相同目录下生成日志文件:DelExpiredLog.log现实执行的 ...

  5. python删除过期文件_python删除过期文件的方法

    本文实例讲述了python删除过期文件的方法.分享给大家供大家参考.具体实现方法如下: # remove all jpeg image files of an expired modification ...

  6. 关于SQL Server自动备份无法删除过期的备份文件奇怪现象

    关于SQL Server自动备份无法删除过期的备份文件奇怪现象 关于SQL Server自动备份无法删除过期的备份文件 数据库服务器每天凌晨两点进行数据库备份,同时对5天前的数据库备份文件进行删除,不 ...

  7. redis删除过期key的算法_面试官别再问我Redis内存满了该怎么办了

    概述 Redis的文章,我之前写过一篇关于「Redis的缓存的三大问题」,累计阅读也快800了,对于还只有3k左右的粉丝量,能够达到这个阅读量,已经是比较难了. 这说明那篇文章写的还过得去,收到很多人 ...

  8. oracle删除无效归档日志,求助:rman无法按照策略删除过期的归档日志

    无法按照策略删除过期1天后的归档日志,请各位帮忙看看,如何解决? RMAN> delete obsolete; 使用目标数据库控制文件替代恢复目录 RMAN 保留策略将应用于该命令 将 RMAN ...

  9. Linux定时删除过期日志文件

    1.问题 Linux服务器上有程序持续产生临时文件供其它程序使用,但这些文件只需保留一段时间,后续要经常进行删除过期文件,人工删除一是输出时间长,二是多个目录删除繁琐 2.解决方案 使用Linux自带 ...

最新文章

  1. 后MATLAB时代的七种开源替代,一种堪称完美!
  2. Spring Cloud Sleuth 服务跟踪 将跟踪信息存储到数据库
  3. Hibernate最佳实践
  4. Windows的三种坐标系:屏幕坐标系,非客户区坐标系,客户区坐标系
  5. 快速复制数据库表中的数据SQL
  6. [深入JUnit] 测试运行的入口
  7. Cassandra1.2文档学习(7)—— 规划集群部署
  8. 到底什么才是人生最大的投资
  9. html下拉刷新原理,微信小程序 下拉刷新及上拉加载原理解析
  10. [Oracle]Oracle表权限小结
  11. java8新特性及汪文君Google Guava项目实战
  12. 模糊:让你的代码远离偷窥之眼
  13. Ubuntu查看联想笔记本无线网卡内核并安装驱动
  14. Python招聘职位大体是两个方向
  15. POI之Excel单元格样式
  16. 视频教程-微信小程序从入门基础(第一季)-PHP
  17. Xcode运行报错The operation couldn’t be completed.
  18. 如何理解共价键的方向性和饱和性
  19. MySQL-查询权限索引约束
  20. python nlp文本摘要实现_用TextRank算法实现自动文本摘要

热门文章

  1. 网络性能测试工具 -- iperf
  2. 第K小元素 时间复杂度n
  3. Internet 服务总线
  4. 图书销售系统App的设计与实现
  5. java 全局变量线程安全_Java中的线程安全全局变量
  6. 服务器安全策略 - 建议
  7. java watch_Watch机制
  8. db2锁表后如何解锁_DB2解除锁表
  9. 计算机系统(三):内存管理(下篇)
  10. python 枪_用Python抢枪过年的火车票