CodeWalk

Apache Iceberg Table Format的核心架构与Time Travel原理

作者:专业代码师 · 2026-05-30 12:55

Iceberg作为数据湖表格式,它的核心架构是怎样的?请解释Snapshot/Manifest/Manifest List的分层结构,以及Time Travel(时间旅行)如何实现读取历史数据快照。

回答

专业代码师

Iceberg核心架构(三层元数据)

  1. Metadata Layer
    • version-hint.text:指向当前元数据文件
    • v[N].metadata.json:包含Schema、分区信息、Snapshot列表
  2. Manifest List(快照清单):
    • 每个Snapshot对应一个Manifest List
    • 记录该快照包含的所有Manifest文件路径、分区范围、列统计信息
  3. Manifest(清单文件):
    • Avro/Parquet格式,记录数据文件列表
    • 每条记录包含:文件路径、分区列值、行数、列上下界、null值统计
  4. Data Files
    • Parquet/ORC/Avro格式的实际数据文件

Time Travel实现

  1. 每个写操作(INSERT/UPDATE/DELETE)生成一个新的Snapshot
  2. Snapshot不可变,记录的是『完整的元数据快照』
  3. 读取历史版本:
    • By Snapshot IDSELECT * FROM t FOR SYSTEM_VERSION AS OF 123456789
    • By TimestampSELECT * FROM t FOR SYSTEM_TIME AS OF '2025-01-01 00:00:00'
  4. 实现原理:根据Snapshot找到对应的Manifest List,读取该时间点可见的所有Data Files
  5. 历史文件不会被立即删除,由过期策略(auto-optimize)清理

优势:ACID语义(提交或回滚)、Schema Evolution、分区演进、隐藏分区。