数据湖与开放表格式:Parquet · Iceberg · Delta · Hudi 内核拆解
读者读完 列存引擎内核(ClickHouse / DuckDB 读优化)、PostgreSQL 行存 OLTP 与 LSM 写优化引擎 之后,还缺一块:数据不在数据库进程里,而在对象存储上的一堆文件中,如何当成一张支持 ACID、更新、删除、时间旅行的表来用。这正是 lakehouse 的核心问题。
本系列不写 SQL 教程,也不写 BI 选型,写:
- 一个 Parquet 文件在磁盘上如何切成 row group / column chunk / page,谓词如何在读取前裁掉数据。
- 没有中心化的数据库进程,怎么在 S3 这种「最终一致、list 很贵、不能改写」的对象存储上做原子提交。
- Iceberg 的 snapshot / manifest 元数据树、Delta 的事务日志、Hudi 的 timeline,三种表格式到底差在哪。
- 行级 update / delete 在湖上怎么落地:copy-on-write、merge-on-read、deletion vector。
- catalog(Hive Metastore / REST / Unity / Polaris / Nessie)、查询引擎(Trino / Spark / DuckDB / DataFusion)、流式入湖(Flink / Kafka Connect)如何拼成一个能运维的湖仓。
系列状态:已完成(2026-06-30)。全 21 篇正文均已发布,可点进阅读。
版本锚定:Parquet 与 Arrow 以格式规范(format spec)为准;表格式以 Iceberg 表规范 V2 为主线,V3 新特性(deletion vector、row lineage)单独标注;库版本 Iceberg 1.x、Delta Lake 3.x+、Hudi 1.x,源码与规范引用标注 release / spec 版本。
适合谁看
- 数据平台 / 数据工程师:设计或维护基于对象存储的湖仓,负责 ingest、compaction、表治理。
- 从数仓 / OLAP 转的开发者:已有列存直觉(见 列存引擎内核),想搞清表格式这层抽象。
- 流式 / 实时方向:要把 CDC、Kafka、Flink 的数据稳定写进湖,且控制小文件与 exactly-once。
- 架构 / 选型负责人:在 Iceberg / Delta / Hudi 与各家 catalog 之间做技术决策。
推荐阅读路径
| 路径 | 篇目 | 适合 |
|---|---|---|
| 数据平台工程师 | 1 → 2 → 8 → 17 → 18 → 20 | 端到端建湖 |
| 从 OLAP / 列存来 | 2 → 4 → 8 → 10 → 14 | 文件格式与表格式衔接 |
| 流式 / 实时入湖 | 1 → 8 → 10 → 19 | CDC 与小文件 |
| 表格式选型决策 | 1 → 8 → 12 → 13 → 14 → 15 | Iceberg/Delta/Hudi 取舍 |
| 湖上 AI / 向量 | 2 → 8 → 18 → 21 | 把湖当训练/检索底座 |
| 完整通读 | 1 → … → 21 | 系统掌握 |
一、六个关键问题
- 列式文件在对象存储上如何组织、又如何在读取前被裁剪? → 第 2、3、4、5 章
- 没有数据库进程,怎么在对象存储上做 ACID 与并发控制? → 第 6、7、11、12 章
- Iceberg / Delta / Hudi 的元数据模型差在哪? → 第 8–14 章
- 行级 update / delete 在湖上怎么实现(CoW / MoR / deletion vector)? → 第 10、12、13 章
- catalog、查询引擎、流式写入如何拼成一个可运维的湖仓? → 第 15、18、19、20 章
- 湖仓如何承接 AI / 向量负载? → 第 21 章
二、篇目依赖
flowchart TD
A["01 Lakehouse 全景"] --> B["02 Parquet 格式"]
B --> C["03 ORC 对照"]
B --> D["04 Arrow 内存格式"]
D --> E["05 列式编码与压缩"]
A --> F["06 对象存储语义"]
F --> G["07 表格式为何存在"]
G --> H["08 Iceberg 元数据树"]
H --> I["09 隐藏分区与演进"]
H --> J["10 行级删除与 MoR"]
H --> K["11 提交协议与并发"]
G --> L["12 Delta 事务日志"]
G --> M["13 Hudi Timeline"]
J --> N["14 三者对照与互通"]
L --> N
M --> N
K --> O["15 Catalog 之争"]
I --> P["16 时间旅行与演进"]
E --> Q["17 小文件与 Compaction"]
N --> R["18 查询引擎如何读湖"]
O --> R
J --> S["19 流式写入与 CDC 入湖"]
R --> U["21 湖上 AI 与向量"]
R --> T["20 选型、迁移与运维"]
S --> T
三、目录(全 21 篇)
第一部分:列式文件格式(第 1–5 篇)
- Lakehouse 全景:从 Hive 表到开放表格式 — Hive 目录式分区表的并发与原子提交困境,lakehouse 的「文件 + 元数据」分层,本系列要回答的问题。
- Parquet 文件格式深拆 — row group / column chunk / page、dictionary/RLE/bit-packing 编码、page index 与 bloom filter,谓词下推如何裁页。
- ORC 文件格式与 Parquet 对照 — stripe / row index、轻量索引、与 Parquet 的编码与生态取舍。
- Apache Arrow 内存格式与零拷贝 — buffer 布局、validity bitmap、IPC / Flight,Arrow 与 Parquet 的「内存 vs 磁盘」分工。
- 列式编码与压缩 — dictionary、delta、RLE 与 LZ4/ZSTD 的组合,与 列存引擎压缩 对照。
第二部分:对象存储与 ACID 基础(第 6–7 篇)
- 对象存储语义与代价 — S3 一致性模型、list 与 rename 的真实代价、multipart、与 POSIX 文件系统的关键差异。
- 表格式为什么存在 — 目录式分区的元数据瓶颈、缺原子提交、缺快照隔离,开放表格式用什么补上。
第三部分:Iceberg 内核(第 8–11 篇)
- Iceberg
元数据树 —
metadata.json/ manifest list / manifest / snapshot 四层结构,一次读如何收敛到文件集合。 - 隐藏分区与分区演进 — partition spec、transform(bucket/truncate/day)、隐藏分区如何避免分区裂脑,演进为何不重写数据。
- 行级删除与 Merge-on-Read — position delete vs equality delete、CoW 与 MoR 取舍、V2/V3 与 deletion vector。
- 提交协议与并发控制 — 元数据指针原子 swap、乐观并发与重试、REST catalog 提交语义。
第四部分:Delta 与 Hudi(第 12–14 篇)
- Delta
Lake 事务日志 —
_delta_log的 JSON action 与 parquet checkpoint、protocol 版本、deletion vector 与 liquid clustering。 - Apache Hudi — timeline、file group / file slice、record-level index、CoW 与 MoR、compaction 与 clustering。
- 三者对照与互通 — Iceberg / Delta / Hudi 的元数据与更新模型对比,UniForm、XTable 等互操作方案。
第五部分:治理、引擎、集成与前沿(第 15–21 篇)
- Catalog 之争 — Hive Metastore、Iceberg REST Catalog、Glue、Nessie(类 git 分支)的职责与锁语义;单列 Apache Polaris 与 Unity Catalog 开源后的最新形态与互通。
- 时间旅行、schema 与分区演进 — snapshot 过期与回滚、schema evolution 规则、演进对老数据的兼容边界。
- 小文件与 Compaction — 写入产生小文件的根因、bin-pack 与 sort / z-order / clustering、统计信息(Puffin)维护。
- 查询引擎如何读湖 — Trino / Spark / DuckDB / DataFusion 的 file pruning、partition pruning、列裁剪与统计下推路径对照。
- 流式写入与 CDC 入湖 — Flink / Kafka Connect sink、upsert 与 exactly-once、流式写入与小文件、compaction 的拉扯。
- 选型、迁移与运维 — 从 Hive 表迁移、benchmark 口径与陷阱、生产故障模式(孤儿文件、元数据膨胀、提交冲突)。
- 湖上 AI 与向量 — embedding / 特征 / 训练数据存湖,Lance 等面向向量与随机访问的格式,Iceberg/Parquet 上的向量检索与下推,与 db-frontier 的衔接边界。
四、系列联动
| 系列 | 联动 |
|---|---|
| 列存引擎内核 | 向量化执行、压缩编码、Parquet 与 MergeTree 文件格式对照 |
| storage | 对象存储、压缩、冷热分层 |
| db-frontier | 向量引擎、HTAP、湖上 AI 负载 |
| distributed | 一致性模型、乐观并发与原子提交 |
五、边界
不写 SQL / BI / 建模教程;不写云厂商托管湖仓(如各家 managed Iceberg)的内部实现;性能数据须自测或明确标注为引用来源。Iceberg V3 等尚在演进的特性按规范状态标注,不当成稳定结论。
系列 index v2,2026-06-30 — 全 21 篇规划,正文逐篇产出
同主题继续阅读
把当前热点继续串成多页阅读,而不是停在单篇消费。
【数据湖与开放表格式】表格式为什么存在
目录式分区表(Hive 表)在对象存储上有三处硬伤:并发写部分提交、list planning 太贵、缺快照隔离与原子提交。本文拆开放表格式补上的四件事——原子提交、快照隔离、文件级统计裁剪、schema 与分区演进,并抽象出三家共有的『元数据指针 + 不可变数据文件』骨架。
【数据湖与开放表格式】Lakehouse 全景:从 Hive 表到开放表格式
Hive 目录式分区表把『表』等同于『一组目录加 metastore 里的分区行』,于是没有原子提交、planning 要 LIST 目录、schema 与分区演进常要重写。本文用这三个硬伤切入,讲清 lakehouse 把表拆成『不可变数据文件 + 可变元数据指针 + catalog』三层后各自解决了什么,并给出全系列的分层地图。
【数据库研究前沿】Iceberg vs Hudi vs Delta:湖仓表格式的事务边界与选型
把 Apache Iceberg、Apache Hudi、Delta Lake 放在同一张表上比较:metadata layout、snapshot isolation、多写者 OCC 协议、schema 与 partition evolution,最后给出 iceberg vs hudi 选型矩阵与对象存储上的事务边界。
【数据湖与开放表格式】Iceberg、Delta、Hudi 对照与互通
把前面 08–13 章拆过的 Iceberg、Delta、Hudi 放在一个坐标系里对照:元数据模型、行级更新、并发控制、引擎生态四维,每维标清口径。再讲两条互通路线——Delta UniForm(写时同步生成 Iceberg/Hudi 元数据)与 Apache XTable(事后转换元数据),以及它们的边界。最后给一棵按写入模式/引擎栈/更新频率展开的选型决策树,不做排名。