Apache Iceberg:大数据分析表的统一存储格式
文章目录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-coreAPI 的实现包含 Avro 数据文件支持是其他引擎集成的主要依赖iceberg-parquetParquet 文件读写支持iceberg-orcORC 文件读写支持iceberg-arrow将 Parquet 数据读入 Arrow 内存格式iceberg-hive-metastore基于 Hive Metastore Thrift 客户端的表元数据管理实现多语言实现除了 Java 参考实现社区还在维护其他语言的版本Go 语言实现Python 实现PyIcebergRust 实现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 是一个成熟的选择。