Apache Iceberg Table Format的核心架构与Time Travel原理
Iceberg作为数据湖表格式,它的核心架构是怎样的?请解释Snapshot/Manifest/Manifest List的分层结构,以及Time Travel(时间旅行)如何实现读取历史数据快照。
回答
专业代码师
Iceberg核心架构(三层元数据):
- Metadata Layer:
version-hint.text:指向当前元数据文件v[N].metadata.json:包含Schema、分区信息、Snapshot列表
- Manifest List(快照清单):
- 每个Snapshot对应一个Manifest List
- 记录该快照包含的所有Manifest文件路径、分区范围、列统计信息
- Manifest(清单文件):
- Avro/Parquet格式,记录数据文件列表
- 每条记录包含:文件路径、分区列值、行数、列上下界、null值统计
- Data Files:
- Parquet/ORC/Avro格式的实际数据文件
Time Travel实现:
- 每个写操作(INSERT/UPDATE/DELETE)生成一个新的Snapshot
- Snapshot不可变,记录的是『完整的元数据快照』
- 读取历史版本:
- By Snapshot ID:
SELECT * FROM t FOR SYSTEM_VERSION AS OF 123456789 - By Timestamp:
SELECT * FROM t FOR SYSTEM_TIME AS OF '2025-01-01 00:00:00'
- By Snapshot ID:
- 实现原理:根据Snapshot找到对应的Manifest List,读取该时间点可见的所有Data Files
- 历史文件不会被立即删除,由过期策略(auto-optimize)清理
优势:ACID语义(提交或回滚)、Schema Evolution、分区演进、隐藏分区。