Apache Polaris™ is an open-source, fully-featured catalog for Apache Iceberg™. It implements Iceberg's REST API, enabling seamless multi-engine interoperability across a wide range of platforms, including Apache Doris™, Apache Flink®, Apache Spark™, Dremio® OSS, StarRocks, and Trino.
Documentation is available at https://polaris.apache.org. The REST OpenAPI specifications can be browsed online: Polaris Management API and Polaris Catalog API.
For a high-level, auto-generated tour of the codebase's modules and relationships, see the Code Wiki for Apache Polaris. It is a third-party, auto-generated navigation aid, useful for orientation, but the source tree remains the authoritative reference.
To get involved, subscribe to the dev mailing list (or browse the archives) and read the CONTRIBUTING guide.
- Overview of what Polaris is and how it works.
- Quickstart to set up a Polaris instance locally or on a supported cloud provider.
The repository is organized into the following groups of Gradle modules. Each leaf is a Gradle subproject; some link to a per-module README.
- Core
polaris-core- entity definitions and core business logic
- API - generated from the OpenAPI specifications:
polaris-api-management-model,polaris-api-management-service- Polaris Management APIpolaris-api-iceberg-service- Iceberg REST servicepolaris-api-catalog-service- Polaris Catalog API
- Runtime
polaris-server- Quarkus-based serverpolaris-admin- admin tool, mainly for bootstrapping persistencepolaris-runtime-service- the Polaris service packagepolaris-runtime-defaults- default runtime configurationpolaris-distribution- distribution packagingpolaris-runtime-common,polaris-runtime-test-common- shared runtime and test utilitiespolaris-runtime-spark-tests- integration tests for the Spark plugin
- Persistence
polaris-relational-jdbc- JDBC implementation ofBasePersistence
- Extensions
polaris-extensions-federation-hive,polaris-extensions-federation-hadoop,polaris-extensions-federation-bigquery- catalog federationpolaris-extensions-auth-opa,polaris-extensions-auth-ranger(plus*-tests) - external authorization
- Tooling & build support
polaris-bom,polaris-build-logic,polaris-version- BOM, shared build logic, versioningpolaris-immutables,polaris-misc-types,polaris-container-spec-helper- shared utilitiespolaris-minio-testcontainer,polaris-rustfs-testcontainer,polaris-hms-testcontainer- test containerspolaris-config-docs-{annotations,generator,site}- reference-doc generationaggregated-license-report- aggregated license report
- Tests
polaris-tests- normative integration tests, reusable downstream
Other top-level directories:
spec/- OpenAPI specificationsclient/python/- Python clientplugins/spark/- Polaris Spark pluginregtests/- regression testshelm/- Helm chartssite/- documentation sitecodestyle/,gradle/,server-templates/- build, style, and codegen support
Additional tooling lives in the separate Polaris-Tools repository.
Apache Polaris is built using Gradle with Java 21+ and Docker 27+.
./gradlew build- To build and run tests. Make sure Docker is running, as the integration tests depend on it../gradlew assemble- To skip tests../gradlew check- To run all checks, including unit tests and integration tests../gradlew run- To run the Polaris server locally; the server is reachable at localhost:8181. This is also suitable for running regression tests, or for connecting with Spark. Set your own credentials by specifying system property./gradlew run -Dpolaris.bootstrap.credentials=POLARIS,root,secretwhere:POLARISis the realmrootis the CLIENT_IDsecretis the CLIENT_SECRET- If credentials are not set, it will use preset credentials
POLARIS,root,s3cr3t
./regtests/run_spark_sql.sh- To connect from Spark SQL. Here are some example commands to run in the Spark SQL shell:
create database db1;
show databases;
create table db1.table1 (id int, name string);
insert into db1.table1 values (1, 'a');
select * from db1.table1;env POLARIS_HOST=localhost ./regtests/run.sh- To run regression tests locally, see more options here.
make build-server,make build-adminbuild components and container imagesmake minikube-start-cluster,make minikube-cleanupmanage a local minikube clustermake helm-doc-generate,make helm-unittestwork with the Helm chartsmake client-lint,make client-regeneratework with the Python clientmake install-dependencies-brewinstall developer prerequisites on macOS
Build the image locally:
./gradlew \
:polaris-server:assemble \
:polaris-server:quarkusAppPartsBuild --rerun \
-Dquarkus.container-image.build=trueRun the published image:
docker run -p 8181:8181 -p 8182:8182 apache/polaris:latestThe repository also ships docker-compose examples for various configurations. See the Quickstart for details.
Servers can be configured in several ways: see the Configuration Guide.
Default values live in runtime/defaults/src/main/resources/application.properties.
Docs use Hugo with the Docsy theme. To preview locally:
site/bin/run-hugo-in-docker.shSee site/README.md for more.
Build scans for apache/polaris branch and tag CI runs are published to the ASF Develocity instance at
develocity.apache.org when the
DEVELOCITY_ACCESS_KEY org secret is available. Pull-request CI publishes to Gradle's public Develocity
instance instead.
Local builds publish a scan only when invoked with --scan, and only after you accept Gradle's
terms of service. Forks and other CI environments can opt in by setting
GRADLE_TOS_ACCEPTED=true. Optional overrides: DEVELOCITY_PROJECT_ID, DEVELOCITY_SERVER, and a
DEVELOCITY_ACCESS_KEY GitHub secret if you self-host Develocity.
Apache Polaris is under the Apache License Version 2.0. See the LICENSE.