ClickHouse는 Horizon에서 제공하는 Iceberg REST API(Apache Polaris 기반)를 통해 Snowflake Horizon Catalog에 연결할 수 있습니다.
이를 통해 catalog_type = 'horizon'으로 설정된 DataLakeCatalog 데이터베이스 엔진을 사용하여 ClickHouse에서 Snowflake 관리형 Iceberg 테이블을 읽고 쓸 수 있습니다.
Horizon은 Snowflake Open Catalog / 자체 호스팅 Polaris와 관련은 있지만 동일한 것은 아닙니다.
Open Catalog / Polaris (catalog_type = 'rest') |
Horizon (catalog_type = 'horizon') |
|
|---|---|---|
| 엔드포인트 | Open Catalog 또는 자체 호스팅 Polaris URI | https://<org>-<account>.snowflakecomputing.com/polaris/api/catalog |
| Warehouse | Polaris catalog / warehouse 이름 | Snowflake 데이터베이스 이름(일반적으로 대문자) |
| 인증 범위 | PRINCIPAL_ROLE:ALL(일반적) |
session:role:<ROLE> |
| 자격 증명 | client_id:client_secret |
PAT 또는 키 쌍 JWT를 catalog_credential로 사용(OAuth client_secret는 ':' 기준으로 분리되지 않음)하거나 bearer auth_header 사용 |
사전 요구 사항
- Snowflake 관리형 Iceberg 테이블이 있는 Snowflake 계정
- Horizon Iceberg REST endpoint:
https://<organization>-<account>.snowflakecomputing.com/polaris/api/catalog - Iceberg 테이블에 대한 권한이 있는 Snowflake 역할(INSERT를 수행하려면 쓰기 권한도 필요)
- 다음 중 하나를 사용하는 인증:
- 프로그래밍 방식의 액세스 토큰 (PAT)
- 액세스 토큰으로 교환되는 키 쌍 JWT
- 외부 OAuth 액세스 토큰(bearer
auth_header로 사용)
- ClickHouse에서 액세스할 수 있는 객체 스토리지(vended 자격 증명 권장)
- DataLakeCatalog Iceberg를 지원하는 ClickHouse
연결 생성
옵션 A: 프로그래밍 방식의 액세스 토큰(권장)
SET allow_experimental_database_iceberg = 1;
CREATE DATABASE horizon_catalog
ENGINE = DataLakeCatalog('https://<org>-<account>.snowflakecomputing.com/polaris/api/catalog')
SETTINGS
catalog_type = 'horizon',
warehouse = 'ICEBERG_TEST_DB',
catalog_credential = '<PAT>',
auth_scope = 'session:role:DATA_ENGINEER',
oauth_server_uri = 'https://<org>-<account>.snowflakecomputing.com/polaris/api/catalog/v1/oauth/tokens',
vended_credentials = 1;warehouse에는 Snowflake 가상 웨어하우스가 아닌 Snowflake 데이터베이스 이름을 지정해야 합니다.
따옴표로 묶지 않은 Snowflake 식별자는 대문자로 표기합니다.
옵션 B: 사전 교환한 Bearer 액세스 토큰
CREATE DATABASE horizon_catalog
ENGINE = DataLakeCatalog('https://<org>-<account>.snowflakecomputing.com/polaris/api/catalog')
SETTINGS
catalog_type = 'horizon',
warehouse = 'ICEBERG_TEST_DB',
auth_header = 'Authorization: Bearer <ACCESS_TOKEN>',
vended_credentials = 1;Iceberg 테이블 쿼리
USE horizon_catalog;
SHOW TABLES;
SELECT count(*) FROM `PUBLIC.test_table`;
SHOW CREATE TABLE `PUBLIC.test_table`;쓰기 경로
INSERT/UPDATE/DELETE 권한(테이블을 생성할 때는 CREATE ICEBERG TABLE 권한 포함)이 있는 역할을 사용하면 ClickHouse는 동일한 카탈로그를 통해 데이터를 쓸 수 있습니다:
-- Insert into an existing Snowflake-managed Iceberg table
INSERT INTO horizon_catalog.`PUBLIC.test_table`
SELECT
number AS id,
concat('name_', toString(number)) AS name
FROM numbers(100);
-- Create a new Iceberg table in the Horizon catalog (requires CREATE ICEBERG TABLE)
CREATE TABLE horizon_catalog.`PUBLIC.clickhouse_written`
(
id Int64,
name String
)
ENGINE = Iceberg;정확한 CREATE TABLE 구문은 사용 중인 버전에서 REST 카탈로그에 지원되는 ClickHouse Iceberg / DataLakeCatalog 쓰기 기능에 따라 달라지며, Snowflake 권한 관련 실패는 카탈로그 HTTP 오류로 표시됩니다.
MergeTree에 로드하기
CREATE TABLE my_clickhouse_table
(
id Int64,
name String
)
ENGINE = MergeTree
ORDER BY id;
INSERT INTO my_clickhouse_table
SELECT * FROM horizon_catalog.`PUBLIC.test_table`;