데이터 웨어하우징 시작하기: 개요
데이터 웨어하우징 시작하기: 개요
데이터 레이크 테이블을 조회하고, MergeTree로 가속화하고, 결과를 Iceberg에 다시 쓰는 실습형 워크스루예요. 모든 단계가 공개 데이터셋을 사용하며 Cloud와 OSS 모두에서 동작해요.
출처: 문서
본문
TL;DR 데이터 레이크 테이블을 조회하고, MergeTree로 가속화하고, 결과를 Iceberg에 다시 쓰는 실습형 워크스루예요. 모든 단계가 공개 데이터셋을 사용하며 Cloud와 OSS 모두에서 동작해요.
이 가이드의 스크린샷은 ClickHouse Cloud SQL 콘솔에서 가져온 거예요. 모든 쿼리는 Cloud와 자체 관리(self-managed) 배포 모두에서 동작해요. ClickHouse는 오픈 테이블 포맷을 읽는 세 가지 방법을 제공해요: 테이블 함수(table function), 테이블 엔진, 그리고 DataLakeCatalog 데이터베이스 엔진이에요. 테이블이 데이터 카탈로그에 있다면 (Glue, Unity Catalog, REST 등), DataLakeCatalog로 연결해서 모든 Iceberg/Delta 테이블에 한 번에 접근할 수 있어요. 아래의 테이블 함수와 테이블 엔진 섹션은 임시(ad hoc) 쿼리나 특정 스토리지 경로를 알고 카탈로그를 사용하지 않을 때 가장 적합해요.
1. Iceberg 데이터 직접 조회하기
시작하는 가장 빠른 방법 — 특히 임시 쿼리나 카탈로그를 사용하지 않을 때 — 은 icebergS3() 테이블 함수예요. S3의 Iceberg 테이블을 가리키면 설정 없이 즉시 조회할 수 있어요. 스키마를 살펴볼게요:
DESCRIBE icebergS3('https://datasets-documentation.s3.amazonaws.com/lake_formats/iceberg/')
쿼리를 실행해 볼게요:
SELECT
url,
count() AS cnt
FROM icebergS3('https://datasets-documentation.s3.amazonaws.com/lake_formats/iceberg/')
GROUP BY url
ORDER BY cnt DESC
LIMIT 5
ClickHouse는 S3에서 Iceberg 메타데이터를 직접 읽고 자동으로 스키마를 추론해요. 같은 방식이 deltaLake(), hudi(), paimon()에도 적용돼요.
더 알아보기: 오픈 테이블 포맷 직접 조회하기가 네 가지 포맷, 분산 읽기를 위한 클러스터 변형, 스토리지 백엔드 옵션(S3, Azure, HDFS, local)을 다뤄요.
2. 영구 테이블 엔진 만들기
카탈로그를 사용하지 않지만 같은 경로를 반복해서 조회한다면, Iceberg 테이블 엔진으로 테이블을 만들어 매번 경로를 전달하지 않아도 돼요. 데이터는 S3에 그대로 남아 있어요 — 데이터가 중복되지 않아요:
CREATE TABLE hits_iceberg
ENGINE = IcebergS3('https://datasets-documentation.s3.amazonaws.com/lake_formats/iceberg/')
이제 다른 ClickHouse 테이블처럼 조회할 수 있어요:
SELECT
url,
count() AS cnt
FROM hits_iceberg
GROUP BY url
ORDER BY cnt DESC
LIMIT 5
테이블 엔진은 데이터 캐싱, 메타데이터 캐싱, 스키마 진화(schema evolution), 타임 트래블(time travel)을 지원해요. 테이블 엔진 기능에 대한 자세한 내용은 직접 조회하기 가이드를, 전체 기능 비교는 지원 매트릭스를 확인해 주세요.
3. 카탈로그에 연결하기
조직이 데이터 카탈로그를 사용한다면 이 통합 경로가 권장돼요. 카탈로그는 테이블 메타데이터와 발견(discovery)을 중앙화해요. 모든 스토리지 경로에 대한 테이블 정의를 관리하는 대신, DataLakeCatalog 데이터베이스 엔진으로 한 번 연결하면 돼요. 카탈로그의 모든 테이블이 ClickHouse 테이블로 나타나요. 연결을 만든 후 상류에서 추가된 테이블도 포함돼요.
카탈로그를 사용할 때 권장 Glue, Unity Catalog, REST 및 기타 지원 카탈로그를 사용하는 프로덕션 워크로드에는 DataLakeCatalog를 사용하세요. 테이블 함수와 테이블 엔진은 특정 경로를 알 때 동작하지만, 카탈로그가 커지면 동기화 상태를 유지하지 못하고 테이블별로 별도의 자격 증명이나 경로가 필요해요.
다음은 AWS Glue에 연결하는 예시예요:
CREATE DATABASE my_lake
ENGINE = DataLakeCatalog
SETTINGS
catalog_type = 'glue',
region = '<your-region>',
aws_access_key_id = '<your-access-key>',
aws_secret_access_key = '<your-secret-key>'
카탈로그 유형마다 고유한 연결 설정이 필요해요. 지원되는 카탈로그의 전체 목록과 구성 옵션은 Catalogs 가이드를 확인해 주세요. 테이블을 찾아보고 조회해 볼게요:
SHOW TABLES FROM my_lake;
SELECT count(*) FROM my_lake.`<database>.<table>`
ClickHouse가 네임스페이스를 하나 이상 네이티브로 지원하지 않기 때문에 <database>.<table> 주변에는 백틱이 필요해요.
더 알아보기: 데이터 카탈로그에 연결하기가 Delta와 Iceberg 예시를 포함한 전체 Unity Catalog 설정을 다뤄요.
4. 쿼리 실행하기
위에서 어떤 방법을 사용했든 — 테이블 함수, 테이블 엔진, DataLakeCatalog — 동일한 ClickHouse SQL이 모두에서 작동해요. 프로덕션에서 카탈로그를 사용하면 DataLakeCatalog 데이터베이스를 통해 조회하고, 다른 예시는 빠른 테스트와 경로 기반 접근에 유용해요:
-- Table function
SELECT url, count() AS cnt
FROM icebergS3('https://datasets-documentation.s3.amazonaws.com/lake_formats/iceberg/')
GROUP BY url ORDER BY cnt DESC LIMIT 5
-- Table engine
SELECT url, count() AS cnt
FROM hits_iceberg
GROUP BY url ORDER BY cnt DESC LIMIT 5
-- Catalog
SELECT url, count() AS cnt
FROM my_lake.`<database>.<table>`
GROUP BY url ORDER BY cnt DESC LIMIT 5
쿼리 구문은 동일해요 — FROM 절만 달라져요. 모든 ClickHouse SQL 함수, 조인, 집계는 데이터 소스와 관계없이 동일하게 동작해요.
적격 쿼리에 컴퓨팅 추가 On-Demand Compute는 지원되는 Apache Iceberg 및 Delta Lake 데이터에 대한 적격 SELECT 쿼리에 대해 비공개 프리뷰로 제공되고 있어요. 서비스 크기를 조정하지 않고도 기존 서비스와 엔드포인트를 통해 임시로 추가 ClickHouse 워커를 할당해요. 자격과 제한 사항은 On-Demand Compute 문서를 참고하세요.
5. ClickHouse에 부분집합 로드하기
Iceberg를 직접 조회하는 건 편리하지만, 성능은 네트워크 처리량과 파일 레이아웃에 의해 제한돼요. 분석 워크로드에는 데이터를 네이티브 MergeTree 테이블로 로드하는 게 좋아요. 먼저 Iceberg 테이블에 대해 필터링된 쿼리를 실행해서 기준선(baseline)을 잡을게요:
SELECT
url,
count() AS cnt
FROM hits_iceberg
WHERE counterid = 38
GROUP BY url
ORDER BY cnt DESC
LIMIT 5
Iceberg는 counterid 필터를 인식하지 못하므로 이 쿼리는 S3의 전체 데이터셋을 스캔해요 — 몇 초가 걸릴 거예요. 이제 MergeTree 테이블을 만들고 데이터를 로드할게요:
CREATE TABLE hits_clickhouse
(
url String,
eventtime DateTime,
counterid UInt32
)
ENGINE = MergeTree()
ORDER BY (counterid, eventtime);
INSERT INTO hits_clickhouse
SELECT url, eventtime, counterid
FROM hits_iceberg
MergeTree 테이블에 동일한 쿼리를 다시 실행해 볼게요:
SELECT
url,
count() AS cnt
FROM hits_clickhouse
WHERE counterid = 38
GROUP BY url
ORDER BY cnt DESC
LIMIT 5
counterid가 ORDER BY 키의 첫 번째 컬럼이므로, ClickHouse의 스파스 기본 인덱스가 관련 granule로 바로 점프해요. 1억 개의 행을 모두 스캔하는 대신 counterid = 38인 행만 읽는 거예요. 그 결과 극적인 속도 향상이 발생해요.
분석 가속화하기 가이드는 여기서 더 나아가 LowCardinality 타입, 전문 인덱스, 최적화된 정렬 키를 사용해 2억 8300만 행 데이터셋에서 약 40배 개선을 보여줘요.
더 알아보기: MergeTree로 분석 가속화하기가 스키마 최적화, 전문 인덱싱, 완전한 전후 성능 비교를 다뤄요.
6. Iceberg에 다시 쓰기
ClickHouse는 Iceberg 테이블에 데이터를 다시 쓸 수도 있어요. 이를 통해 다른 도구(Spark, Trino, DuckDB 등)에서 소비할 집계 결과나 부분집합을 게시하는 역방향 ETL 워크플로가 가능해져요. 출력용 Iceberg 테이블을 만들게요:
CREATE TABLE output_iceberg
(
url String,
cnt UInt64
)
ENGINE = IcebergS3('https://your-bucket.s3.amazonaws.com/output/', 'access_key', 'secret_key')
집계된 결과를 써 볼게요:
SET allow_experimental_insert_into_iceberg = 1;
INSERT INTO output_iceberg
SELECT
url,
count() AS cnt
FROM hits_clickhouse
GROUP BY url
ORDER BY cnt DESC
결과로 만들어진 Iceberg 테이블은 Iceberg와 호환되는 어떤 엔진에서든 읽을 수 있어요.
더 알아보기: 오픈 테이블 포맷에 데이터 쓰기가 UK Price Paid 데이터셋을 사용해 원본 데이터와 집계 결과를 쓰는 방법을, ClickHouse 타입을 Iceberg로 매핑할 때의 스키마 고려 사항을 포함해 다뤄요.
다음 단계
전체 워크플로를 살펴봤으니 이제 각 영역을 더 깊이 파보세요:
- 카탈로그 연결하기 — 카탈로그 기반 워크로드에 권장. Delta와 Iceberg를 포함한 전체 Unity Catalog 워크스루
- 직접 조회하기 — 네 가지 포맷, 클러스터 변형, 테이블 엔진, 캐싱
- 분석 가속화하기 — 스키마 최적화, 인덱싱, 약 40배 속도 향상 데모
- 데이터 레이크에 쓰기 — 원본 쓰기, 집계 쓰기, 타입 매핑
- 지원 매트릭스 — 포맷과 스토리지 백엔드 간 기능 비교
- 모범 사례 — 접근 방법 선택, 성능 설정, 워크로드 패턴