apache/iceberg

数据

让多个查询引擎同时安全读写同一批超大规模分析表的表格式。

9,380
3,634
Java
Apache-2.0
创建于 7 年前

当多个引擎或多个团队需要共享同一批大表、而不是由单一数仓独占时,Apache Iceberg 值得认真考虑。本仓库是 Java 参考实现,其他语言的实现放在独立项目中。

解决什么问题

团队把 PB 级的 Parquet 或 ORC 文件放在对象存储里,希望 Spark、Trino、Flink 和 Hive 都能查询。如果没有表格式,引擎看到的只是一个文件目录:文件清单容易过期,没有真正的 schema 变更,并发写入会产生残缺或冲突的结果。引入 Iceberg 后,引擎读取的是“表”而不是目录,同一份数据能被一致地查询,写入方通过表元数据协调。最终得到一张多个引擎可以同时安全使用的表。

有什么不同

Iceberg 把表元数据与数据文件分开。格式规范定义了快照、清单文件和元数据层,本仓库的 Java 库是其他实现参照的参考实现。实际使用时,处理引擎依赖核心模块,Parquet、ORC 和 Arrow 支持是可选模块。README 的模块划分正对应这一点:iceberg-core 是处理引擎应当依赖的模块,而 iceberg-parquet、iceberg-orc、iceberg-arrow 都是可选项。

实际好处是引擎选择权:项目说明 Spark、Trino、Flink、Presto、Hive 和 Impala 可以同时操作同一批表,各引擎集成以独立模块提供。代价是 Iceberg 属于基础设施,不是开箱即用的数据库。你不直接运行它,而是先选 catalog 和计算引擎,再加上对应集成。因此兼容性取决于你使用的 Spark、Flink 或 Hive 版本,项目在多引擎支持页面上跟踪这些版本。Spark 和 Flink 提供 runtime jar 以规避依赖冲突,但选哪种打包方式同样要由你决定。

谁值得试

适合已经将大表放在对象存储、需要多个引擎读取,或者需要在 Spark 与 Flink 作业之间共享表抽象的数据平台团队。不适合只想查询几个本地 CSV 文件的开发者,也不适合单引擎的小型数仓——那种规模下原有表抽象已经够用,引入 Iceberg 反而要额外处理 catalog、版本和集成选择。

本仓库只包含 Java 实现。如果你的技术栈是 Python、Go、Rust 或 C++,README 指向各自的独立实现,应先去了解对应项目,再把流水线押在这个仓库上。

使用条件与边界

构建 Java 库需要 Gradle 和 Java 17 或 21,运行测试还需要 Docker。如果你的 CI 环境不能跑容器,或者构建镜像没有这些 JDK 版本,这就是实际门槛。使用已发布版本不需要自己构建,但升级前仍需对照多引擎支持文档确认引擎兼容性。

日常维护主要是版本对齐:每个引擎集成都按 Spark 版本拆分子模块,格式本身也在持续增加新特性。核心库是参考实现,其他语言实现不保证完全同步;它们各自追赶到什么程度,所给材料没有说明,若你依赖其中之一需要自行确认。

HotRepo 点评

HotRepo 只记录到一次日榜观测:2026-10-28 该项目为 9,379 stars,当天增加 6。这只是单日快照,无法判断关注度在上升还是消退。对一个 Apache 项目来说,趋势本来也不是决策重点。真正要判断的是你的引擎版本是否在 Iceberg 当前支持的范围内,以及你是否愿意承担 catalog 与集成的选型成本。升级前请以多引擎支持文档为准。

本文由 AI 根据项目 README 生成,更新于 2026年10月28日,以项目官方文档为准。

Hacker News 讨论