Apache Polaris: A Metadata Catalog That Puts Iceberg Interoperability First
Apache Polaris is an interoperable metadata catalog for Apache Iceberg tables designed for cross-engine compatibility.
At a glance
- What is it?
- Apache Polaris is an open-source catalog for Apache Iceberg tables, built around the Iceberg REST API. This review covers its architecture, setup, and the trade-offs of adopting it for multi-engine data lakes.
- Who is it for?
- Adopt Apache Polaris if you run multiple query engines against Iceberg tables and need a shared catalog that speaks the Iceberg REST API natively. Skip it if you are locked into a single engine's catalog or need a lightweight embedded catalog.
- Can I use it commercially?
- Yes. Apache-2.0 is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository last received commits 1 day ago.
- What is it written in?
- Mainly Java, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on September 14, 2026, and from our analysis. They are not legal advice.
DEEP OPEN-SOURCE ANALYSIS
The Problem: Iceberg's Catalog Gap
Apache Iceberg solves the table format problem, but not the catalog problem. Without a shared catalog, each engine keeps its own view of tables, leading to inconsistency and duplicated metadata. Apache Polaris fills that gap by acting as a central metadata catalog that any Iceberg-compatible engine can talk to. It implements Iceberg's REST API, which means engines like Apache Spark, Apache Flink, Trino, Doris, Dremio OSS, and StarRocks can all use the same catalog without custom connectors. This is for teams that run multiple engines on the same data lake and want a single source of truth for table metadata. If you only use one engine, a built-in catalog might be simpler, but Polaris becomes valuable the moment you add a second engine.
How Polaris Works: REST API and Modular Core
Polaris is a server-side catalog that exposes two main APIs: the Polaris Management API and the Polaris Catalog API. The Catalog API is the Iceberg REST API, so engines can register, load, and update tables through standard HTTP calls. The Management API handles administrative tasks like creating catalogs and managing principals. Under the hood, the repository is split into Gradle modules. The core module, polaris-core, contains entity definitions and business logic. The API modules are generated from OpenAPI specifications, which keeps the server contract in sync with the spec. The runtime is built on Quarkus, with polaris-server as the main server. Persistence is pluggable; the default is a JDBC implementation, but the interface is called BasePersistence, suggesting you can swap in other stores. Extensions for federation allow Polaris to connect to external catalogs like Hive, Hadoop, and BigQuery, and for authorization you can plug in OPA or Ranger. This modular design means you can run Polaris as a standalone service or embed it in a larger system.
Getting It Running: Gradle, Docker, and a Quickstart
The README gives clear commands to get a local instance up. You need Java 21+ and Docker 27+ because integration tests rely on containers. To build and run tests, use ./gradlew build. To skip tests, use ./gradlew assemble. For a local server, run ./gradlew run, which starts Polaris at localhost:8181. The default credentials are preset as POLARIS, root, s3cr3t, but you can set your own with a system property: ./gradlew run -Dpolaris.bootstrap.credentials=POLARIS,root,secret. The format is realm, client ID, client secret. Once running, you can connect from Spark SQL using the provided script ./regtests/run_spark_sql.sh, and then run SQL commands like create database db1; create table db1.table1 (id int, name string); and insert. There is also a Makefile with convenience commands like make build-server and make build-admin. The quickstart link points to the official docs for local or cloud setup, but the README itself is enough to get a dev instance running.
Limitations and When It Is the Wrong Tool
Polaris is not a lightweight catalog. It requires a running server, a persistence backend, and credential management. If you are a single developer experimenting with Iceberg locally, spinning up a Quarkus server with Docker is overkill. The build process also assumes Docker is available, which can be a hurdle in restricted environments. The README mentions integration tests depend on Docker, so if you cannot run Docker, you cannot run the full test suite. Another limitation is that the federation extensions are optional; if you need to bridge to Hive or BigQuery, you must configure those extensions, which adds complexity. The documentation is still evolving; the README points to a third-party Code Wiki for orientation, which suggests the project's own docs are not yet exhaustive. Also, the Iceberg REST API is still evolving, so you must ensure your engine's client is compatible with the version Polaris implements. For a production deployment, you need to plan for high availability and scaling, which the README does not cover in detail.
Alternatives: Comparing Approaches
The main alternative is using a cloud-native catalog like AWS Glue Data Catalog or a Hive Metastore. AWS Glue is a managed service that works with Iceberg, but it is proprietary and ties you to AWS. Hive Metastore is open source and widely used, but it was designed for Hive tables, not Iceberg, and its REST support is limited. Another alternative is Nessie, which is also an open-source catalog for Iceberg, but it adds a Git-like versioning layer on top of the table metadata. The difference in approach is that Polaris focuses on implementing the Iceberg REST API directly, making it a drop-in for any engine that speaks that API, whereas Nessie introduces its own branching and tagging model that requires engine-side integration. For teams that want a standard, interoperable catalog without versioning, Polaris is simpler. For teams that need time-travel across table versions, Nessie might be a better fit, but it is a different architecture.
Maintenance and Upgrade Costs
Polaris is an Apache project, which means it follows Apache's release and governance processes. The recent releases (1.5.0, 1.6.0, 1.7.0) show an active cadence, with about a month between minor versions. This means you should expect regular updates and potentially breaking changes as the Iceberg REST API evolves. The project uses a BOM (polaris-bom) and shared build logic, which helps manage dependencies. The repository includes a Helm chart for Kubernetes deployment, which is a plus for containerized environments, but it also implies an ongoing operational burden. The admin tool, polaris-admin, is mainly for bootstrapping persistence, so you will need to handle schema migrations yourself or via the tool. The license is Apache-2.0, which is permissive for commercial use, but you should review the NOTICE file for any attribution requirements. The README does not mention a specific upgrade path, so you should test upgrades in a staging environment before rolling out.
The Verdict: A Strong Candidate for Multi-Engine Data Lakes
Apache Polaris addresses a real pain point: the lack of a standard catalog for Iceberg tables across engines. Its focus on the Iceberg REST API is the right bet, because that API is becoming the de facto standard for Iceberg catalogs. The modular architecture and extension points for federation and authorization make it adaptable to various environments. However, it is not a turnkey solution; you need to invest in deployment and operations. For teams already committed to Iceberg and running multiple engines, Polaris is worth serious consideration. For those with a single engine or a preference for a managed service, the overhead may not justify the benefits. Before adopting, verify that your engine's Iceberg client supports the REST API version that Polaris 1.7.0 implements, and test the federation extensions against your actual external stores. The project is young but active, so monitor the release notes for API changes. If you need a catalog that speaks Iceberg natively and you have the operational capacity, Polaris is a credible choice.
Editorial conclusion
Adopt Apache Polaris if you run multiple query engines against Iceberg tables and need a shared catalog that speaks the Iceberg REST API natively. Skip it if you are locked into a single engine's catalog or need a lightweight embedded catalog. Before committing, verify that your engine's Iceberg REST client matches the API version Polaris implements, and check the federation extensions for your specific external stores. Polaris is a solid choice for cross-engine interoperability, but it is not a zero-config drop-in; it requires a server, a persistence layer, and careful credential management.
Community notes