实时数据湖技术选型:Hudi、Iceberg、Delta Lake、Paimon 怎么选
实时数据湖技术选型:Hudi、Iceberg、Delta Lake、Paimon 怎么选
为什么需要数据湖格式?
传统数仓的痛点很明显:数据先入 Kafka 或 MySQL,再通过离线 ETL 写入 HDFS/Hive。这个链路里,更新和删除是老大难问题——Hive 不支持行级 UPDATE,只能全量覆盖分区,数据延迟大、资源浪费严重。
数据湖表格式(Table Format)要解决的核心问题就是:让数据湖像数据库一样支持 ACID、UPSERT、时间旅行。Hudi、Iceberg、Delta Lake、Paimon 都是这一层的产物。
它们不是"数据库",而是定义了一套如何在文件系统上组织 Parquet/ORC 文件的规范,包括元数据管理、索引、快照隔离等。
四个选手的基因差异
Apache Hudi(Hadoop Upserts Deletes and Incrementals)
Hudi 的出身决定了它的核心优势:强在增量写入。Uber 当年造它就是为了解决司机行程数据的实时更新问题。
Hudi 写入时会给每条记录打一个 _hoodie_record_key,后续更新通过主键匹配,把旧记录标记删除、写新记录。这个机制天然适合 CDC(Change Data Capture)场景——上游 MySQL binlog → Kafka → Flink/Spark → Hudi 湖。
核心概念:
- COW(Copy On Write):每次写入重写整个文件,读性能好,写放大严重
- MOR(Merge On Read):增量写 log 文件,读时合并,适合高频更新
适用场景:订单、用户画像、物流轨迹——需要频繁更新、对时效敏感的宽表
Apache Iceberg
Iceberg 是 Netflix 为了解决 Hive 分区性能问题造的。它的设计哲学是 "元数据先行"——把表的所有状态信息(快照、分区、列统计)存到独立的元数据文件里,查询引擎读取时先拿到元数据再决定读哪些文件。
这个设计带来的好处:
- 隐藏分区(Hidden Partitioning):不依赖目录结构推断分区,避免了 Hive 式的
WHERE dt='2024-01-01'全表扫描 - 引擎中立:Spark/Flink/Trino/Presto/Dremio 都能原生读写,不需要适配
- 快照隔离:每次写入生成新快照,读请求拿到的是一致性视图
适用场景:ETL 结果表、分析型宽表、多引擎混用的数仓底座。如果你的团队同时用 Spark 和 Trino,Iceberg 几乎是最安全的选择
Delta Lake
Databricks 出品,和 Spark 深度绑定。Delta Lake 的核心是 事务日志(Transaction Log)——一个 _delta_log 目录下的 JSON 文件,记录每次写入的元数据变更。
Delta Lake 的设计和 Iceberg 有很多相似之处(ACID、时间旅行、Schema 演进),但它的生态壁垒很明显:
- 在 Databricks 上开箱即用,体验最好
- 离开 Spark 生态后,Flink/Presto 的集成不如 Iceberg 成熟
- Delta Sharing 是独有的跨组织数据共享能力
适用场景:全链路在 Databricks/Spark 上的团队。如果你已经在用 Databricks,没必要折腾换 Iceberg
Apache Paimon(原 Flink Table Store)
阿里系,后捐给 Apache。Paimon 的定位是 "Flink 原生"——它不是先有 Spark 版再适配 Flink,而是从 Flink 的 Checkpoint 机制长出来的。
Paimon 的强项:
- 流式写入延迟最低:借助 Flink Checkpoint 实现秒级数据可见
- LSM Tree 存储结构:写入友好,适合高频更新
- 阿里云生态集成:MaxCompute、Flink 一体化
适用场景:纯 Flink 链路 + 阿里云的团队。如果你已经在用阿里云 Flink,Paimon 是成本最低的选择
选型决策框架
你的主要计算引擎?
├── Spark + Flink 混用 → Hudi 或 Iceberg
├── 纯 Spark/Trino 分析 → Iceberg
├── 纯 Databricks 生态 → Delta Lake
└── 纯 Flink + 阿里云 → Paimon
你的写入模式?
├── 大量 UPDATE/DELETE → Hudi(MOR 模式)
├── 批量覆盖 + 偶尔更新 → Iceberg 或 Delta Lake
└── 极致低延迟流式写入 → Paimon
你的团队规模?
├── 小团队、单引擎 → 选引擎绑定最强的
├── 大团队、多引擎 → Iceberg(最中立)
└── 已有 Databricks 付费 → Delta Lake(别浪费预算)
简化版的判断:如果你的核心需求是实时更新(CDC 入湖),首选 Hudi;如果是要建通用数仓底座,Iceberg 是最稳的选择;如果不想折腾、已经在某个生态里,就选那个生态原生的。
常见误区
-
"Hudi 只适合流式,Iceberg 只适合批式" — 不准确。两者都能批能流,区别在于 Hudi 的增量更新比 Iceberg 更成熟,Iceberg 的查询生态比 Hudi 更广
-
"选一个就得全栈迁移" — 不必。很多团队是 Hudi 做写入层(接 CDC),Iceberg 做查询层(接分析引擎),两者共存
-
"Paimon 只是 Flink Table Store 换了个名字" — 架构升级了不少,但确实还是 Flink 原生的味道
-
"Iceberg 的元数据太重,性能会拖慢查询" — 恰恰相反,Iceberg 的元数据设计让查询更精准地跳过不需要的文件,减少了不必要的 IO
总结
| 维度 | Hudi | Iceberg | Delta Lake | Paimon |
|---|---|---|---|---|
| 更新能力 | 最强 | 中等 | 中等 | 强 |
| 查询生态 | 中等 | 最广 | Spark 为主 | Flink 为主 |
| 引擎中立性 | 中 | 优 | 差 | 差 |
| 流式延迟 | 低 | 中 | 中 | 最低 |
| 云生态 | 多平台 | 多平台 | Databricks | 阿里云 |
没有银弹。选型的关键是认清自己团队的边界——用什么引擎、处理什么数据、有多少人维护。在边界内选最匹配的,比选"最好"的更有意义。
寒蝉 Hancic

