Apache Polaris:用 Iceberg REST 协议把元数据目录做成公共设施
Apache Polaris 是 Apache Iceberg 表的可互操作元数据目录,专为跨引擎兼容性而设计。
秒懂
- 它是什么?
- Apache Polaris 是一个面向 Apache Iceberg 的元数据目录实现,它把 Iceberg REST API 作为核心接口,目标是让 Spark、Flink、Trino 等引擎共享同一套表元数据。本文基于仓库与文档,拆解它的模块结构、运行方式、扩展点以及适用边界。
- 适合谁用?
- 如果你的团队同时使用 Spark、Flink、Trino 或 Doris 处理同一批 Iceberg 表,并且厌倦了为每个引擎分别维护权限和命名空间,Polaris 值得评估。它把元数据操作收敛到一套 REST 协议上,管理面与数据面分离,这种设计比直接让各引擎连接 Hive Metastore 更干净。
- 能商用吗?
- 可以。Apache-2.0 是宽松许可证:你可以使用、修改并销售基于它的软件,只需保留版权和许可证声明。
- 还在维护吗?
- 在维护。仓库最近一次提交在 1 天前。
- 用什么语言写的?
- 主要是 Java(依据 GitHub 的语言统计)。
以上回答依据项目的 GitHub 数据(最近同步于 2026年9月14日)和我们的分析,不构成法律意见。
开源项目深度解析
它解决的是目录碎片化问题
在 Iceberg 生态里,表元数据原本可以由每个引擎各自管理,但这会导致同一张表在不同引擎眼中状态不一致。Polaris 把元数据目录抽出来,做成一个独立服务,所有引擎通过 Iceberg REST API 访问同一份元数据。这样 Spark 建的表,Trino 能看到,Flink 写入的变更,Doris 也能读到。它面向的是多引擎共存的团队,尤其是那些已经受够了 Hive Metastore 或各自为政的目录方案的人。Polaris 不是存储引擎,它不碰数据文件,只负责表的定义、快照、命名空间和权限。
REST API 是核心,管理面与数据面分离
Polaris 实现了 Iceberg 的 REST catalog API,这是它跨引擎兼容的根基。同时它还提供了一套 Polaris Management API,用于管理目录、命名空间和授权。从仓库的 API 模块可以看到,`polaris-api-iceberg-service` 负责 Iceberg REST 服务,而 `polaris-api-management-service` 负责管理操作。这种分离意味着,引擎只通过标准 Iceberg 协议读写元数据,而管理员通过另一套接口做配置。数据流大致是:客户端向 Polaris 发送 Iceberg REST 请求,Polaris 校验身份和权限,然后从持久化层读取或写入实体。持久化层默认是 JDBC 实现,也就是关系型数据库。
从源码到本地运行:命令与配置
构建 Polaris 需要 Java 21 和 Docker 27,因为集成测试依赖容器。最直接的方式是 `./gradlew run`,它会启动一个本地服务,监听 8181 端口。默认凭据是 `POLARIS,root,s3cr3t`,其中 POLARIS 是 realm,root 是 client id,s3cr3t 是 secret。你可以用 `-Dpolaris.bootstrap.credentials=POLARIS,root,secret` 覆盖。连接 Spark SQL 时,仓库提供了 `./regtests/run_spark_sql.sh` 脚本,里面可以直接执行 `create database db1` 和 `create table db1.table1` 这类语句。注意,`./gradlew build` 会跑集成测试,如果不想跑,用 `./gradlew assemble` 跳过测试。
模块划分:核心、运行时、持久化与扩展
仓库按 Gradle 子项目组织,核心是 `polaris-core`,包含实体定义和业务逻辑。运行时部分包括 `polaris-server`(Quarkus 服务器)、`polaris-admin`(用于引导持久化的管理工具)和 `polaris-runtime-service`(服务打包)。持久化目前只有 `polaris-relational-jdbc` 一个实现,这意味着如果你不想用 JDBC 兼容的数据库,就得自己写持久化层。扩展方面有联邦目录:`polaris-extensions-federation-hive`、`hadoop`、`bigquery`,它们允许 Polaris 代理到现有目录。鉴权扩展支持 OPA 和 Ranger。这些模块的存在说明 Polaris 不是铁板一块,它预留了替换和增强的接口。
联邦与鉴权:真实场景中的两个关键旋钮
联邦目录扩展是 Polaris 的一个务实设计。如果你的公司已经用 Hive Metastore 或 BigQuery 存了一批表,Polaris 可以充当统一入口,把请求转发给底层目录。这避免了“推倒重来”的迁移。但要注意,联邦扩展是分开的,Hive 和 BigQuery 各自独立,不是开箱即用的全家桶。鉴权方面,默认的 bootstrap 凭据是写死在文档里的,生产环境必须改。Ranger 和 OPA 扩展允许你接入已有的权限体系,但这也意味着你要维护额外的组件。如果你的权限需求很简单,也许直接用 Polaris 内置的授权模型就够了。
限制与失败模式:不是银弹
Polaris 的文档没有隐藏它的运行前提:Docker 是集成测试的硬依赖,Java 21 是构建门槛。如果你在隔离环境里跑,没有容器运行时,`./gradlew check` 会失败。另一个限制是持久化层只有 JDBC 实现,这意味着你至少需要一个关系型数据库。对于小团队或单机实验,这有点重。更实际的风险是,Iceberg REST 协议本身还在演进,不同引擎对协议的支持程度不一。Polaris 支持 Doris、Flink、Spark、Dremio、StarRocks、Trino,但如果你用的是冷门引擎,最好先验证它是否实现了完整的 REST catalog 接口。否则你可能会遇到“能连上但某些操作不支持”的尴尬。
替代方案:Hive Metastore 与自建目录
最直接的替代是继续使用 Hive Metastore(HMS)。HMS 是 Iceberg 早期常用的目录实现,很多引擎默认支持。但 HMS 的元数据模型是为 Hive 表设计的,对 Iceberg 的命名空间、快照和权限支持是后加的,而且它没有标准的 REST 管理接口。Polaris 的不同在于,它把 Iceberg 的 REST 协议作为一等公民,管理操作也是通过 OpenAPI 定义的,这意味着你可以用任何语言写客户端来管理目录,而不必依赖 Hive 的 Thrift 接口。另一个替代是自己写一个目录服务,但那需要你维护 Iceberg 协议兼容性,成本远高于使用 Polaris。如果你只需要一个简单的目录,且没有多引擎需求,HMS 可能更省事。
维护成本与许可证考量
Polaris 是 Apache 2.0 许可证,你可以自由使用、修改和分发,但要注意商标声明,README 里明确写了 Apache Polaris 和 Apache Iceberg 是商标。维护成本主要来自版本升级。项目发布节奏看起来是月度级,1.7.0 在 1.6.0 之后不到一个月就发布了,这意味着你需要跟进上游变化,尤其是 API 变更。仓库里有 `polaris-tools` 独立仓库,说明工具链是外置的,你需要额外关注。另外,集成测试依赖 Docker,如果你在 CI 里跑 Polaris 的测试,必须准备容器环境。从项目结构看,测试模块 `polaris-tests` 被设计为可复用,这有助于下游项目做兼容性验证,但这也意味着测试基础设施本身有学习成本。
编辑结论
如果你的团队同时使用 Spark、Flink、Trino 或 Doris 处理同一批 Iceberg 表,并且厌倦了为每个引擎分别维护权限和命名空间,Polaris 值得评估。它把元数据操作收敛到一套 REST 协议上,管理面与数据面分离,这种设计比直接让各引擎连接 Hive Metastore 更干净。但如果你只有单一引擎,或者元数据规模极小,引入一个独立目录服务反而是负担。Polaris 的运维复杂度不低,它需要 Java 21、Docker 27 以及一个关系型数据库来持久化元数据,而且默认的 bootstrap 凭据是公开的,生产环境必须显式覆盖。在决定采用之前,先确认你的引擎是否完整支持 Iceberg REST 协议,尤其是你依赖的 Iceberg 版本与 Polaris 1.7.0 的兼容性。还要检查联邦目录(如 Hive、BigQuery)是否覆盖你现有的表来源,否则迁移成本可能高于收益。
社区笔记