文章目录
- Apache Iceberg:大数据分析表的统一存储格式
Apache Iceberg:大数据分析表的统一存储格式
Apache Iceberg 是 Apache 基金会旗下的开源项目,目前在 GitHub 上获得了 8,983 个 Star。
Iceberg 定义了一种高性能的大数据分析表格式。它把 SQL 表的可靠性和易用性带到了大数据领域,让 Spark、Trino、Flink、Presto、Hive、Impala 这些引擎可以同时安全地操作同一张表。
背景
在大数据场景下,不同计算引擎往往各自维护一套表元数据,导致数据不一致、写入冲突、读取结果不可重复等问题。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-xtest# 跳过测试./gradlew spotlessApply# 自动修复代码格式测试依赖 Docker 环境。在 macOS 上使用 Docker Desktop 时,可能需要手动创建 Docker socket 的符号链接。
总结
Iceberg 解决了大数据场景下多引擎共享表数据的核心问题。它通过表格式抽象层,统一了不同计算引擎对数据的访问方式,同时提供了事务支持、schema 演变和时间旅行等能力。对于需要在多个引擎之间共享数据的团队来说,Iceberg 是一个成熟的选择。
式抽象层,统一了不同计算引擎对数据的访问方式,同时提供了事务支持、schema 演变和时间旅行等能力。对于需要在多个引擎之间共享数据的团队来说,Iceberg 是一个成熟的选择。