요약
Apache Polaris 1.7.0이 2026년 8월 2일 릴리스됐다. 이번 릴리스는 기능 추가보다 카탈로그 운영 신뢰성을 높이는 방향에 집중한다. 멱등 쓰기(idempotent writes) 옵트인, 자격증명 벤딩 정책 강화, 로케이션 인코딩 수정, 고아 파일 정리 수정, 그리고 시맨틱 모델 API 베타 도입이 핵심이다.
릴리스 배경에는 분산 멀티 엔진 환경에서 동일한 테이블을 동시에 수정하는 경쟁 쓰기 문제가 있다. Spark, Flink, Trino가 같은 Iceberg REST 카탈로그를 바라볼 때, 클라이언트 재시도로 인한 중복 커밋이 데이터 불일치를 일으킬 수 있다. 멱등 쓰기는 이 문제를 카탈로그 레이어에서 직접 해결한다. 파괴적 변경(breaking change)으로 JDBC 스키마 v5 전환과 bootstrap 명령어 변경이 포함되어 있어 업그레이드 전 준비가 필요하다.
릴리스 맥락
Apache Polaris는 Iceberg REST 카탈로그 사양의 오픈 소스 레퍼런스 구현이다. 카탈로그는 테이블 메타데이터 포인터를 관리하며, Spark·Trino·Flink·Dremio 같은 여러 엔진이 동일한 Iceberg 테이블을 읽고 쓸 수 있게 중재한다.
1.7.0 이전의 주요 한계는 다음과 같다:
- createTable / updateTable 호출이 멱등하지 않아 클라이언트 재시도 시 중복 상태가 발생할 수 있었다.
- AWS STS 기반 자격증명 벤딩에서 세션 정책을 직접 첨부하는 경로가 없었다.
- GCS 환경에서 벤딩된 자격증명에 원칙 귀속(principal attribution)이 지원되지 않았다.
- Iceberg v2 테이블의 position-delete 파일이
DROP TABLE PURGE후에도 오브젝트 스토리지에 남는 경우가 있었다.
멱등 쓰기 (Idempotent Writes)
동작 방식
멱등 쓰기는 옵트인 방식으로 활성화한다:
polaris.idempotency.enabled=true # 기본값: false
polaris.idempotency.ttl=PT5M # 기본값: 5분활성화하면 클라이언트는 Idempotency-Key HTTP 헤더를 포함해 createTable 또는 updateTable 요청을 보낸다. 폴라리스는 이 키를 테이블 엔티티에 임베드해 동일한 트랜잭션으로 커밋한다. 재시도 요청이 TTL 윈도우 내에 동일한 키를 가져오면 원본 성공 응답을 재전송한다.
카탈로그는 GET /v1/config 응답의 idempotency-key-lifetime 필드를 통해 지원 여부와 TTL을 클라이언트에게 알린다.
구현 방식 변경
초기 설계는 별도의 idempotency_records 테이블을 두고 IdempotencyStore 인터페이스로 관리하는 방식이었다. 1.7.0에서 PR #5086이 이를 제거하고, 멱등성 상태를 테이블 엔티티 자체에 부착하는 엔티티 속성 방식으로 전환했다. 별도 테이블을 관리하는 오버헤드를 없애고 커밋 원자성을 단순화한다.
자격증명 벤딩 강화
AWS: SigV4 세션 정책 첨부
자격증명 벤딩에서 IAM 세션 정책 JSON을 STS AssumeRole 요청에 직접 첨부할 수 있게 됐다. SigV4AuthenticationParameters에 선택적 sessionPolicy 필드가 추가됐다.
실용적 의미: 엔진마다 다른 최소 권한 정책을 적용할 수 있다. 예를 들어 읽기 전용 쿼리 엔진에게는 s3:GetObject만 허용된 세션 정책을 붙이고, 쓰기 엔진에게는 더 넓은 권한을 부여한다.
GCS: 워크로드 아이덴티티 기반 귀속
GCS 환경에서 벤딩된 자격증명에 원칙 귀속(principal attribution)이 추가됐다. 이는 AWS STS 세션 태그의 GCP 대응 기능이다.
활성화하려면 다음 플래그가 필요하다:
| 환경 변수 | 역할 |
|---|---|
GCS_PRINCIPAL_ATTRIBUTION_ENABLED=true | 기능 활성화 |
GCS_PRINCIPAL_ATTRIBUTION_WIF_AUDIENCE | Workload Identity Federation 대상 |
GCS_PRINCIPAL_ATTRIBUTION_TOKEN_ISSUER | 토큰 발급자 URL |
GCS_PRINCIPAL_ATTRIBUTION_SIGNING_KEY_FILE | 서명 키 파일 경로 |
로케이션 인코딩 수정
기본 테이블 스토리지 로케이션이 이제 JVM 기본 문자셋 대신 UTF-8로 퍼센트 인코딩된다.
이전 버전에서는 비ASCII 네임스페이스나 테이블 이름을 사용하면 JVM 기본 문자셋에 따라 로케이션이 달라질 수 있었다. 예를 들어 UTF-8 JVM과 latin-1 JVM에서 동일 테이블이 서로 다른 오브젝트 경로를 가리켰다. 1.7.0은 이 결정을 UTF-8로 고정한다.
주의: 비ASCII 이름을 사용하는 기존 테이블은 인코딩 전환 후 경로가 변경될 수 있다. 업그레이드 전 영향 범위를 확인해야 한다.
고아 파일 정리 개선
Iceberg v2 삭제 매니페스트 처리
ManifestFileCleanupTaskHandler가 Iceberg v2 삭제 매니페스트를 처리하게 됐다. 이전에는 merge-on-read DML을 실행한 v2 테이블에 DROP TABLE PURGE를 실행하면 position-delete 파일과 그 매니페스트가 오브젝트 스토리지에 남았다.
비동기 태스크 재시도
비동기 태스크 실행에서 핸들러가 일시적 오류(IO 오류, 삭제 실패 등)로 false를 반환할 때 재시도하게 됐다. 이전에는 false 반환이 경고 로그만 남기고 태스크가 영구적으로 종료됐다.
시맨틱 모델 API (베타)
1.7.0에는 시맨틱 모델 API의 베타 버전이 포함됐다. 이 API는 Iceberg 테이블 위에 비즈니스 의미 레이어(semantic layer)를 기술하는 스펙을 목표로 한다—계산 열, 측정값, 차원 정의 같은 것들이다.
현 단계에서 알아야 할 것:
- 베타 표시: API 계약이 안정적이지 않다. 이번 릴리스에서 설계한 코드는 다음 릴리스에서 재작성이 필요할 수 있다.
- 방향성 신호: 폴라리스가 단순 메타데이터 카탈로그를 넘어 의미론적 계층까지 포괄하려는 로드맵이 확인됐다.
- 프로덕션 적용 시점: 1.8.0이나 1.9.0에서 API가 안정화될 가능성이 높다.
아키텍처 다이어그램
엔티티 속성 방식 · TTL 5분
GCS 워크로드 아이덴티티 귀속
IO 오류 재시도
__realm__ → NULL
파괴적 변경 (Breaking Changes)
JDBC 스키마 v5
관계형 JDBC 영속성을 사용하는 경우 events.catalog_id 컬럼이 nullable로 변경됐다. 카탈로그에 범위가 없는 이벤트(principal 이벤트, 정책 이벤트, 속도 제한 이벤트 등)는 이전에는 자리 표시자 문자열 __realm__을 저장했지만 이제는 NULL로 저장된다.
기존 __realm__ 값에 의존하는 쿼리나 파이프라인이 있으면 업그레이드 전에 수정해야 한다.
Bootstrap 명령어 변경
관리 도구의 bootstrap 명령어에서 --schema-version (-v) 옵션이 제거됐다. 새 영역(realm)은 항상 최신 스키마 버전으로 부트스트랩된다. 이 옵션을 사용하는 배포 스크립트나 CI 파이프라인이 있으면 해당 인수를 제거해야 한다.
MaintenanceService 시그니처 변경
MaintenanceService.performMaintenance()의 시그니처가 변경됐다. 이제 최신 미완료 유지보수 실행을 대체하기 위한 명시적 OptionalLong overrideRunId 인자가 필요하다. 직접 구현한 MaintenanceService 코드가 있으면 업데이트가 필요하다.
운영 업그레이드 체크리스트
| 항목 | 조치 |
|---|---|
| JDBC 스키마 v5 전환 | events.catalog_id = '__realm__' 조건의 쿼리·파이프라인 수정 |
| bootstrap 스크립트 | --schema-version / -v 인수 제거 |
| MaintenanceService 구현체 | overrideRunId: OptionalLong 인자 추가 |
| 비ASCII 네임스페이스·테이블 | 오브젝트 경로 인코딩 변경 영향 범위 확인 |
| 멱등 쓰기 활성화 여부 | polaris.idempotency.enabled=true (필요 시) + TTL 튜닝 |
| GCS 자격증명 귀속 | 4개 환경 변수 설정 (선택적) |
| 시맨틱 모델 API | 베타 확인—프로덕션 코드 작성 보류 |
정리
Polaris 1.7.0은 카탈로그가 단순한 메타데이터 포인터 저장소에서 트랜잭션 조정 시스템으로 진화하는 과정을 보여준다. 멱등 쓰기는 Iceberg REST 사양이 멀티 엔진 동시 쓰기를 조율하는 프로토콜로 발전하고 있음을 보여준다. 자격증명 벤딩 강화는 클라우드 보안 모범 사례(최소 권한, 감사 추적)를 카탈로그 레이어로 가져온다.
실용적 관점에서 즉시 중요한 것은 파괴적 변경이다. 스키마 v5, bootstrap 명령어 변경, MaintenanceService 시그니처 변경은 업그레이드 전에 반드시 점검해야 한다. 시맨틱 모델 API는 방향성을 이해하는 데는 유용하지만 현 시점에서 프로덕션 의존은 이르다.
References
- Apache Polaris Project, "Apache Polaris 1.7.0," Apache Software Foundation, August 2, 2026. https://polaris.apache.org/downloads/1.7.0/
- Alex Merced, "Apache Polaris 1.7.0 and the Quiet Work of Making a Catalog Trustworthy," DEV Community, 2026. https://dev.to/alexmercedcoder/apache-polaris-170-and-the-quiet-work-of-making-a-catalog-trustworthy-5bd3
- Dremio, "Apache Polaris 1.5.0: Deep-Dive Into the Future of Open Data Catalogs." https://www.dremio.com/blog/apache-polaris-1-5-0-deep-dive-into-the-future-of-open-data-catalogs/