基于本文回答

播面 播面

刷题像听歌,多听自然懂
0
评论

Paimon 的快照过期(Snapshot Expiration)机制是如何运作的?

知识点图片

根据 Apache Paimon 官方文档(master 分支),快照过期(Snapshot Expiration)机制是 Paimon 用于清理历史数据、释放磁盘空间的核心管理机制。以下是其运作方式的详细解析:

1. 快照过期的核心目的

在 Paimon 中,每次写入提交(Commit)都会生成 1 到 2 个快照(Snapshot)。新的快照会添加新数据,或将旧数据标记为删除。为了支持时间旅行(Time Travel)等历史查询功能,被标记删除的数据不会立即物理删除,只有在其所属的快照过期时,对应的旧数据文件和元数据文件才会被真正从物理磁盘中清理。

2. 运作触发机制

  • 自动触发:默认情况下,快照过期是由 Paimon 写入器(Writers)在提交新更改时自动执行的。
  • 手动触发:用户也可以通过调用系统存储过程(如调用 sys.expire_snapshots 存储过程)来手动或通过调度任务触发快照过期。

3. 控制快照过期的核心参数

快照过期主要受以下几个表属性(Table Properties)控制:

参数 默认值 类型 描述
snapshot.num-retained.min 10 Integer 需要保留的已完成快照的最小数量。必须大于或等于 1。
snapshot.num-retained.max Integer.MAX_VALUE Integer 需要保留的已完成快照的最大数量
snapshot.time-retained 1 h Duration 已完成快照的最长保留时间
snapshot.expire.limit 10 Integer 每次过期检查时,允许过期的最大快照数量(防止单次清理任务过重)。
snapshot.expire.execution-mode sync Enum 过期任务的执行模式。sync 为同步执行(可能会短暂阻塞流处理);async 为异步执行。

4. 过期判定逻辑与执行流程

Paimon 决定哪些快照可以过期时,遵循以下逻辑规则:

  1. 保底机制(不满足 Min 不过期):当当前总快照数量小于 snapshot.num-retained.min 时,即使部分快照的时间已经超过了 snapshot.time-retained,也不会触发任何快照过期。
  2. 时间维度过期:当快照总数超过 min 时,系统会开始检查时间。任何生成时间早于 snapshot.time-retained 的快照都会被标记为过期,直到保留的快照数减少至 snapshot.num-retained.min
  3. 数量维度强制过期(Max 限制):如果快照总数超出了 snapshot.num-retained.max,即使部分快照尚未达到保留时间限制(未到 time-retained),最老的快照也会被强制过期,直到总数不超过 snapshot.num-retained.max

5. 防止快照过期的保护机制

在实际生产中,如果快照过期太快,可能会导致流批作业失败(如批查询读取已被删除的旧快照,或流作业重启时找不到对应的快照)。Paimon 提供了以下保护机制:

  • 使用标签(Tags)保护:用户可以基于某个关键快照创建 Tag。Tag 会永久或依据 Tag 保留策略维护该快照的 Manifests 和数据文件,使其不被快照过期机制清理。
  • 使用消费 ID(Consumer ID)保护:在流式消费时,可以指定 consumer-id。Paimon 在执行快照过期时会检查文件系统中的消费者状态,如果某个快照仍被活跃的消费者依赖,该快照就不会被删除,从而保障流作业安全重启。
00:00
00:00