无需厚重 Java 的 Rust 版 Apache Iceberg
如果你从事大数据工作,很可能已经接触过 Apache Iceberg。从本质上讲,它是基于 Parquet 或 ORC 文件构建 Lakehouse 架构的标准。长期以来,Java 一直是 Iceberg 的主要归宿。几乎所有官方库和与 Spark 或 Trino 的集成都是为 JVM 编写的。
然而,数据处理工具栈正在向 Rust 转变。Apache DataFusion、Polars 等项目需要访问 Iceberg 表,但无需启动繁重的 Java 运行时或处理 JNI 绑定。就这样,Apache 基金会内部出现了一个官方仓库 apache/iceberg-rust。
为什么要移植到 Rust
原生实现提供高性能和低内存开销。当你要编写流处理的微服务、工具程序或 PostgreSQL 自定义外部数据包装器时,拖着 JVM 是很痛苦的。JVM 在启动时需要占用数百兆内存,并且会因垃圾回收而定期冻结。
Rust 库可以直接从轻量级二进制文件中读取 Iceberg 元数据和数据。项目在 Apache 基金会内部开发,所以这不是一个私有分支,而是一个官方的基础设施组件。
仓库结构
开发者没有把所有东西打包成一个巨大的单体项目。项目被拆分成了多个独立的模块。你只需要在服务中引入实际需要的依赖。
库的核心位于模块 iceberg 中。它处理元数据解析、清单操作和表模式操作,符合 Iceberg v1 和 v2 规范。
为元数据目录的工作创建了独立的 crate:
iceberg-catalog-rest用于 REST API 操作iceberg-catalog-glue用于 AWS Glue Data Catalog 集成iceberg-catalog-hms用于连接 Hive Metastoreiceberg-catalog-sql用于在 PostgreSQL 或 SQLite 中存储元数据iceberg-catalog-s3tables用于使用 Amazon S3 Tables
模块 iceberg-storage-opendal 处理 S3、GCS 或本地磁盘等物理存储。它使用 Apache OpenDAL 库,这立即打开了对所有流行对象存储的访问。
如果你需要查询执行引擎,模块 iceberg-datafusion 会很有用。这个模块将 Iceberg 绑定到 Apache DataFusion SQL 引擎,使你能够直接从 Rust 对表执行 SQL 查询。
已投入生产的使用场景
开发工作很活跃,但已有严肃的产品在生产环境中使用这个库:
- Databend 在其云数据仓库中使用了它。
- RisingWave 利用该库从其实时数据库中处理 Iceberg。
- Supabase 在 Postgres 扩展和流式 ETL 服务中使用了 Rust Iceberg 组件。
- Moonlink 使用该库在不到一秒的时间内完成从 Postgres 到 Iceberg 格式的 CDC 数据复制任务。
- Apache DataFusion Comet 使用它来加速 Spark 性能。
支持与版本管理
项目团队遵循 MSRV(最低支持的 Rust 版本)策略。代码针对稳定版 Rust 发布版本进行构建和测试。最低支持的编译器版本相对于最近的版本有大约三个月的缓冲期。
开发完全公开。所有讨论都在 [email protected] 邮件列表和 Apache Iceberg 官方 Slack 社区的 #rust 频道中进行。
值得一试吗
如果你正在围绕数据仓库构建服务、编写 Rust 连接器或开发自己的数据处理工具,iceberg-rust 看起来是最合乎逻辑的选择。
该库仍在完善以覆盖整个 Iceberg 规范,但基本的读取、写入和对关键目录的支持已经稳定运行。对于基于 DataFusion 的项目,它已经是一个可用的构建块。
相关项目