Unity Catalog
Unity Catalog
Databricks가 관리하는 Unity Catalog의 Delta와 Iceberg 테이블을 ClickHouse로 조회하는 방법을 살펴봐요.
출처: 문서
본문
ClickHouse는 여러 카탈로그(Unity, Glue, Polaris 등)와의 통합을 지원해요. 이 가이드에서는 ClickHouse와 Unity Catalog를 사용해 Databricks가 관리하는 데이터를 조회하는 단계를 안내할게요. Databricks는 lakehouse에 여러 데이터 포맷을 지원해요. ClickHouse를 사용하면 외부 스토리지 위치를 사용하는 Unity Catalog Delta와 Iceberg 테이블을 조회할 수 있어요.
Unity Catalog는 Databricks 관리형 스토리지에 저장된 Delta Lake 또는 Iceberg 테이블에 대한 credential vending을 제공하지 않아요. ClickHouse는 Unity Catalog에서 테이블 데이터를 읽기 위해 credential vending에 의존해요.
이 기능은 실험적이므로 SET allow_experimental_database_unity_catalog = 1;을 사용해 활성화해야 해요.
Databricks에서 Unity 구성하기
ClickHouse가 Unity 카탈로그와 상호작용하게 하려면 Unity Catalog가 외부 리더와의 상호작용을 허용하도록 구성되어 있어야 해요. 이는 “Enable external data access to Unity Catalog” 가이드를 따라 달성할 수 있어요. 카탈로그가 구성되면 ClickHouse용 자격 증명을 생성해야 해요. Unity와의 상호작용 방식에 따라 두 가지 방법을 사용할 수 있어요:
- Iceberg 클라이언트의 경우 서비스 주체(service principal)로 인증해요.
- Delta 클라이언트의 경우 개인 액세스 토큰(PAT)을 사용해요.
필요한 PAT 토큰 권한
읽기 접근에 PAT를 사용할 때 토큰은 ClickHouse가 Unity Catalog 메타데이터를 나열하고 읽을 수 있게 해주는 권한을 가져야 해요. PAT가 테이블에 대한 SELECT 권한, 부모 카탈로그에 대한 USE CATALOG, 부모 스키마에 대한 USE SCHEMA와 함께 최소한 EXTERNAL USE SCHEMA 권한을 가지고 있는지 확인해 주세요.
Unity Catalog와 ClickHouse 사이의 연결 만들기
Unity Catalog와 인증이 구성되면 ClickHouse와 Unity Catalog 사이의 연결을 수립해요.
Delta 읽기
CREATE DATABASE unity
ENGINE = DataLakeCatalog('https://<workspace-id>.cloud.databricks.com/api/2.1/unity-catalog')
SETTINGS warehouse = 'CATALOG_NAME', catalog_credential = '<PAT>', catalog_type = 'unity'
Iceberg 읽기
외부 Iceberg 테이블에 접근하려면:
CREATE DATABASE unity
ENGINE = DataLakeCatalog('https://<workspace-id>.cloud.databricks.com/api/2.1/unity-catalog/iceberg-rest')
SETTINGS catalog_type = 'rest', catalog_credential = '<client-id>:<client-secret>', warehouse = 'workspace',
oauth_server_uri = 'https://<workspace-id>.cloud.databricks.com/oidc/v1/token', auth_scope = 'all-apis,sql'
ClickHouse로 Unity catalog 테이블 조회하기
이제 연결이 있으니 Unity 카탈로그를 통해 조회할 수 있어요. 예를 들어:
USE unity;
SHOW TABLES;
┌─name───────────────────────────────────────────────┐
│ clickbench.delta_hits │
│ demo.fake_user │
│ information_schema.catalog_privileges │
│ information_schema.catalog_tags │
│ information_schema.catalogs │
│ information_schema.check_constraints │
│ information_schema.column_masks │
│ information_schema.column_tags │
│ information_schema.columns │
│ information_schema.constraint_column_usage │
│ information_schema.constraint_table_usage │
│ information_schema.information_schema_catalog_name │
│ information_schema.key_column_usage │
│ information_schema.parameters │
│ information_schema.referential_constraints │
│ information_schema.routine_columns │
│ information_schema.routine_privileges │
│ information_schema.routines │
│ information_schema.row_filters │
│ information_schema.schema_privileges │
│ information_schema.schema_tags │
│ information_schema.schemata │
│ information_schema.table_constraints │
│ information_schema.table_privileges │
│ information_schema.table_tags │
│ information_schema.tables │
│ information_schema.views │
│ information_schema.volume_privileges │
│ information_schema.volume_tags │
│ information_schema.volumes │
│ uniform.delta_hits │
└────────────────────────────────────────────────────┘
SHOW TABLES
┌─name───────────────┐
│ uniform.delta_hits │
└────────────────────┘
테이블을 조회하려면:
SELECT count(*) FROM `uniform.delta_hits`
백틱 필요 ClickHouse는 네임스페이스를 하나 이상 지원하지 않기 때문에 백틱이 필요해요.
테이블 DDL을 검사하려면:
SHOW CREATE TABLE `uniform.delta_hits`
CREATE TABLE unity_uniform.`uniform.delta_hits`
(
`WatchID` Int64,
`JavaEnable` Int32,
`Title` String,
`GoodEvent` Int32,
`EventTime` DateTime64(6, 'UTC'),
`EventDate` Date,
`CounterID` Int32,
`ClientIP` Int32,
...
`FromTag` String,
`HasGCLID` Int32,
`RefererHash` Int64,
`URLHash` Int64,
`CLID` Int32
)
ENGINE = Iceberg('s3://<path>);
데이터 레이크에서 ClickHouse로 데이터 로드하기
Databricks에서 ClickHouse로 데이터를 로드해야 한다면 먼저 로컬 ClickHouse 테이블을 만들어요:
CREATE TABLE hits
(
`WatchID` Int64,
`JavaEnable` Int32,
`Title` String,
`GoodEvent` Int32,
`EventTime` DateTime64(6, 'UTC'),
`EventDate` Date,
`CounterID` Int32,
`ClientIP` Int32,
...
`FromTag` String,
`HasGCLID` Int32,
`RefererHash` Int64,
`URLHash` Int64,
`CLID` Int32
)
PRIMARY KEY (CounterID, EventDate, UserID, EventTime, WatchID);
그런 다음 INSERT INTO SELECT로 Unity Catalog 테이블에서 데이터를 로드해요:
INSERT INTO hits SELECT * FROM unity_uniform.`uniform.delta_hits`;