实时数据湖技术选型:Hudi、Iceberg、Delta Lake、Paimon 怎么选

25 阅读 2370 字 · 约 8 分钟

实时数据湖技术选型: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 是最稳的选择;如果不想折腾、已经在某个生态里,就选那个生态原生的


常见误区

  1. "Hudi 只适合流式,Iceberg 只适合批式" — 不准确。两者都能批能流,区别在于 Hudi 的增量更新比 Iceberg 更成熟,Iceberg 的查询生态比 Hudi 更广

  2. "选一个就得全栈迁移" — 不必。很多团队是 Hudi 做写入层(接 CDC),Iceberg 做查询层(接分析引擎),两者共存

  3. "Paimon 只是 Flink Table Store 换了个名字" — 架构升级了不少,但确实还是 Flink 原生的味道

  4. "Iceberg 的元数据太重,性能会拖慢查询" — 恰恰相反,Iceberg 的元数据设计让查询更精准地跳过不需要的文件,减少了不必要的 IO


总结

维度HudiIcebergDelta LakePaimon
更新能力最强中等中等
查询生态中等最广Spark 为主Flink 为主
引擎中立性
流式延迟最低
云生态多平台多平台Databricks阿里云

没有银弹。选型的关键是认清自己团队的边界——用什么引擎、处理什么数据、有多少人维护。在边界内选最匹配的,比选"最好"的更有意义。