Apache Iceberg:大数据分析表的统一存储格式

Apache Iceberg 是 Apache 基金会旗下的开源项目,目前在 GitHub 上获得了 8,983 个 Star。

正文顶部截图

Iceberg 定义了一种高性能的大数据分析表格式。它把 SQL 表的可靠性和易用性带到了大数据领域,让 Spark、Trino、Flink、Presto、Hive、Impala 这些引擎可以同时安全地操作同一张表。

README区域截图


背景

在大数据场景下,不同计算引擎往往各自维护一套表元数据,导致数据不一致、写入冲突、读取结果不可重复等问题。Iceberg 的出现就是为了解决这些问题。它在文件系统之上加了一层表格式抽象,记录了数据文件的位置、分区信息、schema 演变历史和快照版本。

有了这层抽象,上层引擎不需要关心底层文件的组织方式,直接通过 Iceberg 提供的 API 读写数据。跨引擎共享同一张表变成了标准操作。


核心能力

Iceberg 支持 ACID 事务。写入操作要么全部完成,要么全部回滚,不会出现中间状态。这意味着多个写入者可以同时操作同一张表而不会互相干扰。

Schema 演变方面,Iceberg 允许用户在不重写数据的情况下添加、删除或重命名列。分区也可以调整,已有的数据文件不需要重新组织。

Iceberg 维护了完整的快照历史。用户可以从任意快照点读取数据,实现时间旅行查询。这在数据回溯和审计场景下很有用。

文件格式上,Iceberg 支持 Parquet、ORC 和 Avro 三种存储格式,用户可以根据场景选择。


多引擎兼容

Iceberg 的设计目标之一就是跨引擎兼容。当前支持的引擎包括:

  • Apache Spark:通过 Datasource V2 API 集成,每个 Spark 版本有对应的子模块
  • Apache Flink:提供专门的集成模块
  • Apache Hive:通过 InputFormat 方式接入
  • Trino / Presto:各项目自行维护 Iceberg 连接器

每个引擎集成模块都提供了 runtime jar,内置了所有依赖,避免版本冲突。


模块结构

Iceberg 的核心 Java 库按功能拆分成了多个模块:

  • iceberg-common:公共工具类
  • iceberg-api:对外公开的 API 接口
  • iceberg-core:API 的实现,包含 Avro 数据文件支持,是其他引擎集成的主要依赖
  • iceberg-parquet:Parquet 文件读写支持
  • iceberg-orc:ORC 文件读写支持
  • iceberg-arrow:将 Parquet 数据读入 Arrow 内存格式
  • iceberg-hive-metastore:基于 Hive Metastore Thrift 客户端的表元数据管理实现

多语言实现

除了 Java 参考实现,社区还在维护其他语言的版本:

  • Go 语言实现
  • Python 实现(PyIceberg)
  • Rust 实现
  • C++ 实现

不同语言的实现让 Iceberg 的使用场景从 JVM 生态扩展到了更广泛的领域。


构建与开发

Iceberg 使用 Gradle 构建,要求 Java 17 或 21。常用命令:

./gradlew build                # 构建并运行测试
./gradlew build -x test        # 跳过测试
./gradlew spotlessApply        # 自动修复代码格式

测试依赖 Docker 环境。在 macOS 上使用 Docker Desktop 时,可能需要手动创建 Docker socket 的符号链接。


总结

Iceberg 解决了大数据场景下多引擎共享表数据的核心问题。它通过表格式抽象层,统一了不同计算引擎对数据的访问方式,同时提供了事务支持、schema 演变和时间旅行等能力。对于需要在多个引擎之间共享数据的团队来说,Iceberg 是一个成熟的选择。

式抽象层,统一了不同计算引擎对数据的访问方式,同时提供了事务支持、schema 演变和时间旅行等能力。对于需要在多个引擎之间共享数据的团队来说,Iceberg 是一个成熟的选择。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐