Iceberg 的 Snapshot、Time Travel 和 Branch 有什么区别?
面试怎么回答
Snapshot 是 Iceberg 每次原子提交后的表状态,也是隔离和历史能力的基础;Time Travel 是按时间或 Snapshot ID 读取过去状态;Branch 是指向独立 Snapshot 链头部的命名引用,可继续写入,适合测试和审计发布;Tag 通常固定重要历史点用于保留。它们都受 Snapshot 生命周期影响,所以历史查询不能替代备份,分支也要配套保留和清理策略。
先把这段讲顺;面试官追问时,再展开下面的原理和细节。
详细讲解
这个类比有帮助,但不能直接照搬。Snapshot、Time Travel、Branch 和 Tag 分别是状态、读取能力和引用机制。
Snapshot 是一次表状态提交;Time Travel 是读取历史 Snapshot;Branch 是可继续写入的命名快照链;Tag 是通常用于保留和审计的命名引用。
Snapshot:表在某次提交后的状态
Iceberg 更新元数据时会产生新的 Snapshot,记录本次操作涉及的 Manifest 和数据文件变化。读任务固定在某个 Snapshot 上,可以获得快照隔离,不会因为同时有新提交就读到半成品。
Snapshot 不是数据文件的完整复制,而是通过元数据引用描述一个表状态,因此历史版本可以共享未变化的数据文件。
Time Travel:按历史版本读取
Time Travel 可以按 Snapshot ID 或时间读取过去状态,适合问题回溯、结果复现、误操作调查和历史对比。
它是一种查询能力,不等于永久备份。Snapshot 过期和无引用文件清理后,历史版本可能无法继续访问,因此审计保留必须结合生命周期策略。
Branch:独立推进的 Snapshot 链
Branch 是指向某条 Snapshot Lineage 头部的命名引用,并可以接收新的写入。它适合数据任务测试、审计分支、Write-Audit-Publish 等流程:先写测试分支,验证后再推进主分支。
Branch 并不天然解决所有数据合并冲突。不同引擎对分支写入和发布支持也要实际验证。

Tag:固定指向的重要历史点
Tag 通常用于给某个 Snapshot 命名,例如月末审计点或发布基线。它不会像 Branch 那样形成持续写入的独立链,更适合保留和查询。
Branch、Tag 可以配置独立保留策略,但最终仍要正确执行 Snapshot 过期和文件清理,避免元数据与存储无限增长。
一个典型场景
新 ETL 逻辑准备上线,直接覆盖主表风险较高。可以从当前状态创建测试 Branch,把新结果写入分支,执行数据质量和指标对比,通过后再发布。
如果只是排查上周报表差异,用 Time Travel 读取历史 Snapshot 就足够,不需要创建可写 Branch。选错机制会增加不必要的生命周期管理。
