dbt-clickhouse 어댑터
지원되는 기능
- 테이블 머티리얼라이즈
- 뷰 머티리얼라이즈
- 증분 머티리얼라이즈
- Microbatch 증분 머티리얼라이즈
- Materialized View 머티리얼라이즈 (
TO형식의 MATERIALIZED VIEW 사용, Experimental) - 시드
- 소스
- 문서 생성
- 테스트
- 스냅샷
- 대부분의 dbt-utils 매크로(이제 dbt-core에 포함됨)
- 임시 머티리얼라이즈
- 분산 테이블 머티리얼라이즈(Experimental)
- 분산 증분 머티리얼라이즈(Experimental)
- 딕셔너리 머티리얼라이즈(Experimental)
- Contracts
- ClickHouse 전용 컬럼 구성(코덱, TTL…)
- ClickHouse 전용 테이블 설정(인덱스, 프로젝션…)
--sample 플래그를 포함하고 향후 릴리스에 대비한 모든 deprecation 경고도 수정되었습니다. Catalog 통합(예: Iceberg)은 dbt 1.10에서 도입되었지만, 아직 어댑터에서 네이티브로 지원되지는 않으며 우회 방법을 사용할 수 있습니다. 자세한 내용은 Catalog Support section을 참조하십시오.
이 어댑터는 아직 dbt Cloud 내에서 사용할 수 없지만, 곧 제공될 예정입니다. 자세한 내용은 지원팀에 문의하십시오.
dbt 개념 및 지원되는 머티리얼라이즈
dbt-clickhouse에서 지원됩니다.
- view (기본값): 모델이 데이터베이스에서 뷰로 빌드됩니다. ClickHouse에서는 view로 빌드됩니다.
- table: 모델이 데이터베이스에서 테이블로 빌드됩니다. ClickHouse에서는 table로 빌드됩니다.
- ephemeral: 모델은 데이터베이스에 직접 빌드되지 않고, 대신 이를 참조하는 모델에 CTE(공통 테이블 표현식)로 포함됩니다.
- 증분: 모델은 처음에는 테이블로 materialize되며, 이후 실행에서는 dbt가 테이블에 새 행을 삽입하고 변경된 행을 업데이트합니다.
- materialized view: 모델이 데이터베이스에서 materialized view로 빌드됩니다. ClickHouse에서는 materialized view로 빌드됩니다.
dbt-clickhouse의 실험적 기능입니다.
dbt와 ClickHouse 어댑터 설정
dbt-core 및 dbt-clickhouse 설치
pip로 설치하는 것이 좋습니다.
dbt에 ClickHouse 인스턴스의 연결 정보를 제공하십시오.
~/.dbt/profiles.yml 파일에서 clickhouse-service 프로필을 구성하고 스키마(schema), 호스트, 포트, 사용자 이름, 비밀번호 속성을 설정하십시오. 연결 구성 옵션의 전체 목록은 기능 및 구성 페이지에서 확인할 수 있습니다:
dbt 프로젝트 만들기
project_name 디렉터리에서 dbt_project.yml 파일을 수정하여 ClickHouse 서버에 연결할 프로필 이름을 지정합니다.
연결 테스트
dbt debug를 실행하여 dbt가 ClickHouse에 연결할 수 있는지 확인합니다. 응답에 Connection test: [OK connection ok]가 포함되면 연결이 성공한 것입니다.
dbt를 ClickHouse와 함께 사용하는 방법을 더 자세히 알아보려면 가이드 페이지로 이동하십시오.
모델 테스트 및 배포(CI/CD)
간단한 데이터 테스트와 단위 테스트를 활용한 CI/CD
dbt build를 실행하는 정도로도 충분합니다.
더 완전한 CI/CD 단계: 최신 데이터를 사용하고, 영향받는 모델만 테스트하기
dbt clone은 zero-copy CLONE 문을 사용하여 MergeTree 테이블을 복사합니다. 자세한 내용은 아래의 dbt clone으로 모델 복제하기를 참조하십시오.
프로덕션 환경 운영에 영향을 주지 않도록 테스트 환경(즉, 스테이징 환경)에는 전용 ClickHouse 클러스터 또는 서비스를 사용하는 것을 권장합니다. 테스트 환경이 실제 운영을 잘 반영하도록 하려면 프로덕션 데이터의 일부를 사용하고, 환경 간 스키마 드리프트를 방지하는 방식으로 dbt를 실행하는 것이 중요합니다.
- 테스트에 최신 데이터가 필요하지 않다면 프로덕션 데이터의 Backup을 스테이징 환경으로 복원할 수 있습니다.
- 테스트에 최신 데이터가 필요하다면
remoteSecure()테이블 함수와 갱신 가능 구체화 뷰를 조합해 원하는 주기로 데이터를 삽입할 수 있습니다. 또 다른 방법으로는 객체 스토리지를 중간 계층으로 사용해 프로덕션 서비스에서 데이터를 주기적으로 기록한 뒤, 객체 스토리지 테이블 함수 또는 ClickPipes(지속적인 수집용)를 사용해 스테이징 환경으로 가져오는 것입니다.
dbt build --select state:modified+ --state path/to/last/deploy/state.json와 같은 명령을 실행하여 프로덕션의 마지막 실행 이후 변경된 내용을 기준으로 필요한 최소한의 모델만 선택적으로 다시 빌드할 수 있습니다.
dbt clone을 사용한 모델 복제
dbt clone 명령어는 MergeTree 계열 엔진을 사용하는 테이블로 머티리얼라이즈된 모델을 복제할 때 ClickHouse의 zero-copy CREATE OR REPLACE TABLE ... CLONE AS ... 문을 사용합니다. 기본 데이터 파트를 중복하지 않고 테이블 사본을 생성하므로, 프로덕션 상태를 기반으로 개발 또는 Slim CI 환경을 구성하는 등 환경을 빠르고 저렴하게 동기화할 수 있습니다.
이 방식으로 복제할 수 없는 모델은 소스 릴레이션을 가리키는 뷰를 생성하는 dbt의 기본 동작으로 폴백됩니다.
- MergeTree 이외의 엔진을 사용하는 테이블
- 분산 머티리얼라이즈
일반적인 문제 해결
연결
- 엔진은 지원되는 엔진 중 하나여야 합니다.
- 데이터베이스에 액세스할 수 있는 충분한 권한이 있어야 합니다.
- 데이터베이스의 기본 테이블 엔진을 사용하지 않는 경우, 모델 구성에서 테이블 엔진을 지정해야 합니다.
장시간 실행되는 작업 이해하기
debug로 높이십시오 — 그러면 각 쿼리에 소요된 시간이 출력됩니다. 예를 들어, dbt 명령에 --log-level debug를 추가하면 됩니다.
dbt 실행과 ClickHouse 쿼리 연결
adapter_response에 반환되므로 run_results.json과 같은 dbt artifact에서 확인할 수 있습니다. system.query_log table에서 이 ID를 조회하여 해당 SQL 문의 실행 시간과 리소스 사용량을 확인할 수 있습니다:
run_results.json의 쿼리 ID는 모델의 기본 SQL 문만 식별합니다. 실행에 포함된 모든 SQL 문을 찾으려면 각 쿼리 텍스트에 포함된 dbt 쿼리 주석을 기준으로 system.query_log를 필터링하십시오.
쿼리 ID를 사용하면 dbt artifact를 사용하는 관측성 도구(예: Elementary)에서 dbt 모델 실행을 system.query_log의 항목에 자동으로 연결할 수도 있습니다.
제한 사항
- 이 플러그인은 ClickHouse 25.3 이상에서만 지원되는 구문을 사용합니다. 이전 버전의 ClickHouse는 테스트하지 않습니다. 또한 현재는 복제된 테이블(Replicated Table)도 테스트하지 않습니다.
dbt-adapter를 동시에 실행하면 충돌이 발생할 수 있습니다. 내부적으로 동일한 작업에 같은 테이블 이름을 사용할 수 있기 때문입니다. 자세한 내용은 이슈 #420을 확인하십시오.- 현재 어댑터는 INSERT INTO SELECT를 사용하여 모델을 테이블로 머티리얼라이즈합니다. 즉, 실행을 다시 수행하면 데이터가 중복될 수 있습니다. 매우 큰 데이터셋(PB)의 경우 실행 시간이 매우 길어져 일부 모델은 사실상 사용하기 어려울 수 있습니다. 성능을 개선하려면 뷰를
materialized: materialization_view로 구현하여 ClickHouse Materialized Views를 사용하십시오. 또한 가능하면GROUP BY를 활용해 각 쿼리가 반환하는 행 수를 최소화하십시오. 소스의 행 수를 그대로 유지한 채 단순 변환만 수행하는 모델보다, 데이터를 요약하는 모델을 우선하는 것이 좋습니다. - 모델을 나타내기 위해 분산 테이블을 사용하려면 각 노드에 기반이 되는 복제된 테이블을 수동으로 생성해야 합니다. 그런 다음 그 위에 분산 테이블을 생성할 수 있습니다. 어댑터는 클러스터 생성을 관리하지 않습니다.
- dbt가 데이터베이스에 릴레이션(테이블/뷰)을 생성할 때는 일반적으로
{{ database }}.{{ schema }}.{{ table/view id }}형식으로 생성합니다. ClickHouse에는 스키마 개념이 없습니다. 따라서 어댑터는{{schema}}.{{ table/view id }}를 사용하며, 여기서schema는 ClickHouse 데이터베이스를 의미합니다. - Ephemeral 모델/CTE는 ClickHouse 삽입 SQL 문에서
INSERT INTO앞에 배치하면 동작하지 않습니다. https://github.com/ClickHouse/ClickHouse/issues/30323을 참조하십시오. 이는 대부분의 모델에는 영향을 주지 않지만, 모델 정의와 기타 SQL 문에서 ephemeral 모델의 배치 위치에는 주의가 필요합니다.
Fivetran
dbt-clickhouse connector는 Fivetran transformations에서도 사용할 수 있으며, dbt를 사용해 Fivetran 플랫폼 내에서 직접 원활하게 통합 및 변환 작업을 수행할 수 있습니다.