Iceberg 表元数据保持一个快照日志,记录了对表所做的更改。快照在 Iceberg 中至关重要,因为它们是读者隔离和时间旅行查询的基础。为了控制元数据大小和存储成本,Iceberg 提供了快照生命周期管理程序,如 expire_snapshots,用于删除基于表快照保留属性不再需要的快照和数据文件。
为了更精细的快照生命周期管理,Iceberg 支持分支和标签,这些是具有独立生命周期的快照的命名引用。这种生命周期由分支和标签级别的保留策略控制。分支是独立的快照血统,并指向该血统的头部。分支和标签具有最大引用年龄属性,用于控制何时应该过期对快照本身的引用。分支具有保留属性,这些属性定义了在分支上保留的最小快照数量以及在分支上保留的单个快照的最大年龄。在运行 expireSnapshots 过程时会使用这些属性。有关 expireSnapshots 算法的详细信息,请参考规范。
用例
分支和标签可以用于处理GDPR(通用数据保护条例)要求,以及保留用于审计的重要历史快照。分支还可以作为数据工程工作流程的一部分,用于创建实验性分支,以测试和验证新任务。请参阅下面的一些示例,了解分支和标签如何促进这些用例。
历史标签
标签可以用于保留用于审计目的的重要历史快照。
上图展示了使用以下保留策略保留重要历史快照,该策略通过 Spark SQL 定义。
- 保留每周1个快照,为期1个月。这可以通过标记每周快照并将标签保留时间设置为一个月来实现。快照将被保留,分支引用本身将保留1周。
-- Create a tag for the first end of week snapshot. Retain the snapshot for a week
ALTER TABLE prod.db.table CREATE TAG `EOW-01` AS OF VERSION 7 RETAIN 7 DAYS;
- 保留每月1个快照,为期6个月。这可以通过标记每月快照并将标签保留时间设置为6个月来实现。
-- Create a tag for the first end of month snapshot. Retain the snapshot for 6 months
ALTER TABLE prod.db.table CREATE TAG `EOM-01` AS OF VERSION 30 RETAIN 180 DAYS;
- 保留每年1个快照,永久保存。这可以通过标记年度快照来实现。分支和标签的默认保留时间是永久的。
-- Create a tag for the end of the year and retain it forever.
ALTER TABLE prod.db.table CREATE TAG `EOY-2023` AS OF VERSION 365;
- 创建一个临时的“test-branch”,该分支保留7天,且分支上的最新2个快照会被保留。
-- Create a branch "test-branch" which will be retained for 7 days along with the latest 2 snapshots
ALTER TABLE prod.db.table CREATE BRANCH `test-branch` RETAIN 7 DAYS WITH SNAPSHOT RETENTION 2 SNAPSHOTS;
上图展示了一个使用审计分支来验证写入工作流的例子。
- 首先确保设置了 write.wap.enabled 参数。
ALTER TABLE db.table SET TBLPROPERTIES (
'write.wap.enabled'='true'
);
- 创建一个从快照3开始的审计分支,该分支将被写入并保留1周。
ALTER TABLE db.table CREATE BRANCH `audit-branch` AS OF VERSION 3 RETAIN 7 DAYS;
- 写入操作在一个独立于主表历史的单独审计分支上执行。
-- WAP Branch write
SET spark.wap.branch = audit-branch
INSERT INTO prod.db.table VALUES (3, 'c');
- 验证工作流可以验证审计分支的状态(例如数据质量)。
- 验证后,可以将主分支快速前进到审计分支的头部,以更新主表的状态。
CALL catalog_name.system.fast_forward('prod.db.table', 'main', 'audit-branch');
在 Iceberg Java 库中,以及在 Spark 和 Flink 引擎集成中,支持创建、查询和写入分支和标签。