Iceberg表格元数据维护一个快照日志,记录对表格所做的更改。快照在Iceberg中非常重要,它们用于实现读取隔离性和时间旅行查询。为了控制元数据的大小和存储成本,Iceberg提供了一些管理快照生命周期的功能,比如根据表格快照保留属性自动删除不再使用的快照和数据文件。
为了更加灵活地管理快照生命周期,Iceberg引入了分支(Branches)和标签(Tags)的概念,它们是对快照的命名引用,并且具有独立的生命周期。每个分支和标签都有自己的保留策略,用于控制其生命周期。分支表示一系列相互独立的快照,并指向该系列的最新快照。分支和标签还可以设置最大引用年龄属性,用于控制何时应该将对快照本身的引用过期。此外,分支还具有保留属性,可定义在分支上保留的最小快照数目以及在分支上保留的每个快照的最大年龄。这些属性在运行expireSnapshots过程时被使用。有关expireSnapshots算法的详细信息,请参考Iceberg规范。
分支和标签的功能可以应用于多种使用场景,以下是其中几个示例:
下面是一个使用Spark SQL语法定义的保留策略示例,该策略通过标签来保留重要的历史快照:
-- 为第一个周末的快照创建标签,并将标签保留7天
ALTER TABLE prod.db.table CREATE TAG `EOW-01` AS OF VERSION 7 RETAIN 7 DAYS
-- 为第一个月末的快照创建标签,并将标签保留180天
ALTER TABLE prod.db.table CREATE TAG `EOM-01` AS OF VERSION 30 RETAIN 180 DAYS
每年保留一个快照,无限期保留。可以通过为每年底的快照创建一个标签来实现,默认情况下,分支和标签的保留时间是永久。
-- 为年末的快照创建标签,并永久保留
ALTER TABLE prod.db.table CREATE TAG `EOY-2023` AS OF VERSION 365
创建一个名为"test-branch"的临时分支,保留7天,并且保留分支上最新的2个快照。
-- 创建一个名为"test-branch"的分支,该分支将保留7天,并且保留分支上最新的2个快照
ALTER TABLE prod.db.table CREATE BRANCH `test-branch` RETAIN 7 DAYS WITH SNAPSHOT RETENTION 2 SNAPSHOTS
以下示例展示了如何使用审计分支来验证写入工作流程:
首先,需要确保启用了Iceberg的写入审计功能:
ALTER TABLE db.table SET TBLPROPERTIES ('write.wap.enabled'='true')
然后,创建一个名为"audit-branch"的审计分支,并指定从某个特定快照版本开始,并将其保留一周:
ALTER TABLE db.table CREATE BRANCH `audit-branch` AS OF VERSION 3 RETAIN 7 DAYS
在写入过程中,将数据写入到独立的审计分支,而不影响主表的历史记录:
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')
当运行expireSnapshots过程后,将删除对审计分支的引用,过期时间为一周。
在Iceberg的Java库、Spark和Flink引擎集成中,可以使用相应的API来创建、查询和写入分支和标签。
h-SQL)