【Iceberg学习二】Branch和Tag在Iceberg中的应用

Iceberg 表元数据保持一个快照日志,记录了对表所做的更改。快照在 Iceberg 中至关重要,因为它们是读者隔离和时间旅行查询的基础。为了控制元数据大小和存储成本,Iceberg 提供了快照生命周期管理程序,如 expire_snapshots,用于删除基于表快照保留属性不再需要的快照和数据文件。

为了更精细的快照生命周期管理,Iceberg 支持分支和标签,这些是具有独立生命周期的快照的命名引用。这种生命周期由分支和标签级别的保留策略控制。分支是独立的快照血统,并指向该血统的头部。分支和标签具有最大引用年龄属性,用于控制何时应该过期对快照本身的引用。分支具有保留属性,这些属性定义了在分支上保留的最小快照数量以及在分支上保留的单个快照的最大年龄。在运行 expireSnapshots 过程时会使用这些属性。有关 expireSnapshots 算法的详细信息,请参考规范。

用例

分支和标签可以用于处理GDPR(通用数据保护条例)要求,以及保留用于审计的重要历史快照。分支还可以作为数据工程工作流程的一部分,用于创建实验性分支,以测试和验证新任务。请参阅下面的一些示例,了解分支和标签如何促进这些用例。

历史标签

标签可以用于保留用于审计目的的重要历史快照。

上图展示了使用以下保留策略保留重要历史快照,该策略通过 Spark SQL 定义。

  1. 保留每周1个快照,为期1个月。这可以通过标记每周快照并将标签保留时间设置为一个月来实现。快照将被保留,分支引用本身将保留1周。
sql 复制代码
-- 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. 保留每月1个快照,为期6个月。这可以通过标记每月快照并将标签保留时间设置为6个月来实现。
sql 复制代码
-- 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. 保留每年1个快照,永久保存。这可以通过标记年度快照来实现。分支和标签的默认保留时间是永久的。
sql 复制代码
-- 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;
  1. 创建一个临时的"test-branch",该分支保留7天,且分支上的最新2个快照会被保留。
sql 复制代码
-- 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;

上图展示了一个使用审计分支来验证写入工作流的例子。

  1. 首先确保设置了 write.wap.enabled 参数。
sql 复制代码
ALTER TABLE db.table SET TBLPROPERTIES (
    'write.wap.enabled'='true'
);
  1. 创建一个从快照3开始的审计分支,该分支将被写入并保留1周。
sql 复制代码
ALTER TABLE db.table CREATE BRANCH `audit-branch` AS OF VERSION 3 RETAIN 7 DAYS;
  1. 写入操作在一个独立于主表历史的单独审计分支上执行。
sql 复制代码
-- WAP Branch write
SET spark.wap.branch = audit-branch
INSERT INTO prod.db.table VALUES (3, 'c');
  1. 验证工作流可以验证审计分支的状态(例如数据质量)。
  2. 验证后,可以将主分支快速前进到审计分支的头部,以更新主表的状态。
sql 复制代码
CALL catalog_name.system.fast_forward('prod.db.table', 'main', 'audit-branch');

在 Iceberg Java 库中,以及在 Spark 和 Flink 引擎集成中,支持创建、查询和写入分支和标签。

相关推荐
czq_26867194873 小时前
Python打卡第46天
开发语言·python
wangqiaowq4 小时前
Ontology 学习
学习
清晨Coding5 小时前
删了 Cookie 还能自动登录?Google系网站登录态自动恢复的原理分析
javascript
kyriewen5 小时前
我扫了 814 个依赖,97 个还敢要 Node 10
前端·javascript·程序员
Evand J6 小时前
【MATLAB例程介绍】(17)永磁同步电机(PMSM)基于自适应无迹卡尔曼滤波(AUKF)的电流噪声在线估计。测量噪声协方差自适应与转速估计对比仿真
开发语言·matlab·卡尔曼滤波·无迹卡尔曼滤波·pmsm·电机滤波
choumou_M6 小时前
算法_1:由浅入深学习快速排序QuickSort
学习·算法·排序算法
程序员大阳6 小时前
HTML+CSS+JS对话式实战(9)-项目总结与问题分析
javascript·css·html·实战·项目总结
BaiPeter7 小时前
ZPL文件预览
开发语言·c++
Hilaku7 小时前
MCP 协议会成为前端 AI 工程的标准接口吗?
前端·javascript·程序员
RobinDevNotes10 小时前
从 Electron 到 GPUI,9 个跨平台桌面方案该怎么选
前端·javascript·rust·electron·openresty·前端开发工具