Iceberg 와 외부 테이블, 카탈로그 (Horizon Catalog, Open Catalog, Polaris)
Snowflake 의 Apache Iceberg 테이블을 Snowflake 카탈로그와 외부 카탈로그로 만드는 방법, 외부 볼륨과 Snowflake 스토리지, 카탈로그 연결 데이터베이스, 외부 엔진이 Horizon Catalog 의 Iceberg REST API 로 읽고 쓰는 구조, 외부 테이블과의 차이를 정리합니다.
왜 Iceberg 인가
Apache Iceberg 는 Parquet 파일과 메타데이터 파일로 테이블을 표현하는 개방형 테이블 포맷입니다. 데이터를 Snowflake 전용 포맷이 아닌 Iceberg 로 두면 Spark, Trino, Flink 같은 다른 엔진도 같은 테이블을 읽고 쓸 수 있습니다. Snowflake 는 Iceberg 사양 v1, v2, v3 를 지원하고, v3 지원은 2026년 5월 GA 가 되었습니다.
두 가지 축: 카탈로그와 저장 위치
| 카탈로그 | 쓰기 | Snowflake 지원 범위 | 대표 쓰임 |
|---|---|---|---|
| Snowflake (Snowflake 관리형) | Snowflake 와 외부 엔진(Horizon REST 경유) | 클러스터링, 복제, Time Travel 등 대부분 | Snowflake 가 주인인 레이크하우스 |
| 외부 카탈로그 (카탈로그 통합) | Snowflake 와 원래 엔진 | 제한적, 생명주기는 외부가 관리 | Glue, Unity Catalog, Open Catalog 에 있는 테이블 읽기와 쓰기 |
| 저장 위치 | 지정 | 저장 과금 | Fail-safe |
|---|---|---|---|
| 외부 볼륨 (고객 버킷) | EXTERNAL_VOLUME = 'my_vol' | 클라우드 제공자가 고객에게 | 없음 |
| Snowflake 스토리지 (2026-06-01 GA) | EXTERNAL_VOLUME = SNOWFLAKE_MANAGED | Snowflake 가 | 영구 테이블이면 있음 |
Snowflake 관리형 Iceberg 테이블
CREATE EXTERNAL VOLUME lake_vol
STORAGE_LOCATIONS = ((
NAME = 'lake-s3'
STORAGE_PROVIDER = 'S3'
STORAGE_BASE_URL = 's3://my-lake/iceberg/'
STORAGE_AWS_ROLE_ARN = 'arn:aws:iam::123456789012:role/snowflake-iceberg'
));
CREATE ICEBERG TABLE lake.sales.orders (
id NUMBER, ordered_at TIMESTAMP_NTZ, amount NUMBER(12,2)
)
CATALOG = 'SNOWFLAKE'
EXTERNAL_VOLUME = 'lake_vol'
BASE_LOCATION = 'sales/orders/';- 압축(compaction) 같은 유지 관리는 Snowflake 가 하고, 필요하면 끌 수 있습니다.
- 2025년 10월 파티션 쓰기와 목표 파일 크기 설정이 GA 가 되었고, 2026년 9월 파티션 진화가 GA 가 되었습니다.
- Snowflake 관리형 Iceberg 테이블도 복제와 장애 조치(BCDR)를 지원합니다.
외부 카탈로그와 카탈로그 연결 데이터베이스
CREATE CATALOG INTEGRATION glue_rest_int
CATALOG_SOURCE = ICEBERG_REST
TABLE_FORMAT = ICEBERG
CATALOG_NAMESPACE = 'analytics'
REST_CONFIG = ( ... )
REST_AUTHENTICATION = ( ... )
ENABLED = TRUE;
-- 원격 카탈로그의 네임스페이스와 테이블을 자동으로 발견하고 동기화
CREATE DATABASE lake_glue
LINKED_CATALOG = ( CATALOG = 'glue_rest_int' );- 카탈로그 연결 데이터베이스(catalog-linked database) 는 원격 Iceberg REST 카탈로그를 통째로 데이터베이스처럼 붙입니다. 2025년 10월부터 외부 관리 테이블과 카탈로그 연결 데이터베이스에 대한 쓰기가 GA 입니다.
- 지원 원천: AWS Glue, Snowflake Open Catalog, Databricks Unity Catalog, Google BigLake Metastore(2026-06 GA), Amazon S3 Tables(2026-08 GA), Microsoft Fabric OneLake 등. 2026년 7월에는 Horizon Catalog 에서 Delta Share 를 소비하는 기능도 GA 가 되었습니다.
- 외부 관리 테이블은 클러스터링, 클론, 표준 스트림, 복제를 지원하지 않습니다.
Horizon Catalog 와 외부 엔진
Snowflake 의 내장 카탈로그인 Horizon Catalog 는 Iceberg REST Catalog API 를 제공합니다. 외부 엔진(Spark 등)이 이 API 로 Snowflake 관리형 Iceberg 테이블을 읽고 씁니다 (2026-02-06 GA). 2026년 1월부터는 Spark 에서 Iceberg 테이블을 읽을 때도 Snowflake 의 마스킹과 행 접근 정책이 적용되고, 9월에는 Iceberg Scan Plan API 가 PuPr 로 나왔습니다.
Snowflake 엔지니어링 블로그(2026-04)에 따르면 Horizon Catalog 의 상호운용 계층은 Apache Polaris 를 카탈로그 엔진으로 씁니다. Apache Polaris 는 Snowflake 가 오픈소스로 기증한 Iceberg REST 카탈로그로, 2026년 2월 18일 Apache 최상위 프로젝트가 되었습니다. 2026 Summit 에서도 "Polaris REST 카탈로그가 Horizon Catalog 안으로 들어갔다" 는 방향이 발표되었습니다.
Snowflake Open Catalog 는 무엇인가
Snowflake Open Catalog 는 Apache Polaris 를 Snowflake 가 관리형 서비스로 운영하는 별도 제품입니다 (예전 이름 Polaris Catalog). Snowflake 계정과 따로 만들고, 여러 엔진이 공유하는 중립 카탈로그로 씁니다. Snowflake 에서는 카탈로그 통합으로 Open Catalog 테이블을 읽거나, Snowflake 관리형 테이블을 Open Catalog 로 동기화해 외부 엔진에 노출합니다. Service Consumption Table 에는 100만 요청당 0.5 크레딧 요금이 있습니다.
팁 새로 설계한다면 "Snowflake 관리형 Iceberg + Horizon REST API 로 외부 엔진 접근" 이 가장 단순합니다. 여러 회사와 엔진이 공동 소유하는 레이크라면 Open Catalog 나 자체 Polaris 같은 중립 카탈로그를 검토합니다.
외부 테이블과 비교
| 항목 | 외부 테이블 | Iceberg 테이블 |
|---|---|---|
| 데이터 | 버킷의 파일 그대로 (CSV, Parquet 등) | Iceberg 메타데이터를 가진 Parquet |
| 쓰기 | 읽기 전용 | 가능 (카탈로그에 따라) |
| 성능 | 파일 목록과 파티션 열에 의존 | 메타데이터 기반 프루닝, 일반 테이블에 가까움 |
| 갱신 | REFRESH 또는 자동 갱신 알림 | 카탈로그 커밋 |
새 프로젝트라면 외부 테이블보다 Iceberg 테이블을 권장합니다. 외부 테이블은 기존 파일 레이크를 잠깐 들여다보는 용도로 남겨 둡니다.
비용
- Snowflake 가 읽고 쓰는 컴퓨트는 웨어하우스 크레딧입니다.
- 외부 볼륨 저장 요금과 리전 간 전송은 클라우드 제공자가 고객에게 청구합니다.
- 자동 갱신과 데이터 등록, 외부 엔진의 Horizon 접근은 서버리스 요금이 붙습니다 (Consumption Table 의 Automated Refresh and Data Registration, 1,000 파일당 0.06 크레딧 등).
트러블슈팅
증상: 외부 엔진에서 쓴 데이터가 Snowflake 에 안 보입니다.
원인: 외부 카탈로그 테이블의 자동 갱신이 꺼져 있거나 갱신 주기가 깁니다.
해결:
ALTER ICEBERG TABLE ... REFRESH로 수동 갱신하고, 카탈로그 통합의 자동 갱신(AUTO_REFRESH)과 주기를 확인합니다.증상: Iceberg 테이블 생성 시 "external volume ... access denied" 가 납니다.
원인: IAM 역할 신뢰 정책에 Snowflake 사용자 ARN 과 외부 ID 가 없습니다.
해결:
DESC EXTERNAL VOLUME lake_vol의 값을 신뢰 정책에 넣고SELECT SYSTEM$VERIFY_EXTERNAL_VOLUME('lake_vol')로 확인합니다.