Skip to main content
이 커넥터는 고급 파티셔닝과 프레디케이트 푸시다운 같은 ClickHouse 전용 최적화를 활용해 쿼리 성능과 데이터 처리 효율을 향상시킵니다. 이 커넥터는 ClickHouse의 공식 JDBC 커넥터를 기반으로 하며, 자체 카탈로그를 관리합니다. Spark 3.0 이전에는 Spark에 내장 카탈로그 개념이 없었기 때문에, 일반적으로 Hive Metastore나 AWS Glue 같은 외부 카탈로그 시스템에 의존했습니다. 이러한 외부 솔루션에서는 Spark에서 사용하기 전에 데이터 소스 테이블을 수동으로 등록해야 했습니다. 하지만 Spark 3.0에 카탈로그 개념이 도입되면서 Spark는 카탈로그 플러그인을 등록해 테이블을 자동으로 검색할 수 있게 되었습니다. Spark의 기본 카탈로그는 spark_catalog이며, 테이블은 {catalog name}.{database}.{table} 형식으로 식별됩니다. 새로운 카탈로그 기능을 사용하면 이제 단일 Spark 애플리케이션에서 여러 카탈로그를 추가해 사용할 수 있습니다.

Catalog API와 TableProvider API 중 선택하기

ClickHouse Spark connector는 Catalog APITableProvider API(포맷 기반 접근 방식)라는 두 가지 액세스 패턴을 지원합니다. 두 방식의 차이를 이해하면 사용 사례에 맞는 접근 방식을 선택하는 데 도움이 됩니다.

Catalog API와 TableProvider API 비교

요구 사항

  • Java 8 또는 17 (Spark 4.0에는 Java 17 이상이 필요합니다)
  • Scala 2.12 또는 2.13 (Spark 4.0은 Scala 2.13만 지원합니다)
  • Apache Spark 3.3, 3.4, 3.5 또는 4.0

호환성 매트릭스

설치 및 설정

ClickHouse를 Spark와 통합하는 방법은 프로젝트 구성에 따라 여러 가지가 있습니다. 프로젝트의 빌드 파일(Maven의 pom.xml 또는 SBT의 build.sbt 등)에 ClickHouse Spark 커넥터를 의존성으로 직접 추가할 수 있습니다. 또는 필요한 JAR 파일을 $SPARK_HOME/jars/ 폴더에 넣거나, spark-submit 명령에서 --jars 플래그를 사용해 Spark 옵션으로 직접 전달할 수 있습니다. 두 방법 모두 Spark 환경에서 ClickHouse 커넥터를 사용할 수 있게 해줍니다.

의존성으로 추가하기

SNAPSHOT 버전을 사용하려면 Maven에서 Sonatype의 SNAPSHOT 릴리스 사용 지침을 따르십시오.

라이브러리 다운로드

바이너리 JAR 파일의 이름 패턴은 다음과 같습니다:
사용 가능한 모든 릴리스 JAR 파일은 Maven Central Repository에서 확인할 수 있습니다. 일별 빌드 SNAPSHOT JAR 파일은 위에서 구성한 Sonatype snapshots 리포지토리를 통해 사용할 수 있습니다.
커넥터가 clickhouse-httpclickhouse-client에 의존하며, 이 둘이 모두 clickhouse-jdbc:all에 포함되어 있으므로 “all” classifier가 지정된 clickhouse-jdbc JAR을 반드시 포함해야 합니다. 전체 JDBC 패키지를 사용하지 않으려는 경우에는 clickhouse-client JARclickhouse-http를 각각 추가할 수도 있습니다.어떤 경우에도 패키지 버전이 호환성 매트릭스를 기준으로 호환되는지 확인하십시오.

카탈로그 등록(필수)

ClickHouse 테이블에 액세스하려면 다음 구성으로 새 Spark 카탈로그를 설정해야 합니다. 이 설정은 다음 방법 중 하나로 지정할 수 있습니다.
  • spark-defaults.conf를 편집하거나 생성합니다.
  • 구성을 spark-submit 명령에 전달합니다(또는 spark-shell/spark-sql CLI 명령에 전달).
  • Context를 초기화할 때 구성을 추가합니다.
ClickHouse 클러스터로 작업할 때는 각 인스턴스마다 고유한 카탈로그 이름을 설정해야 합니다. 예를 들면 다음과 같습니다.
이렇게 하면 Spark SQL에서 clickhouse1 테이블 <ck_db>.<ck_table>에는 clickhouse1.<ck_db>.<ck_table>로, clickhouse2 테이블 <ck_db>.<ck_table>에는 clickhouse2.<ck_db>.<ck_table>로 액세스할 수 있습니다.

TableProvider API 사용하기 (포맷 기반 접근 방식)

카탈로그 기반 접근 방식 외에도, ClickHouse Spark 커넥터는 TableProvider API를 통한 포맷 기반 접근 방식을 지원합니다.

포맷 기반 읽기 예시

포맷 기반 쓰기 예시

TableProvider 기능

TableProvider API는 여러 강력한 기능을 제공합니다:

자동 테이블 생성

존재하지 않는 테이블에 쓸 경우 커넥터가 적절한 스키마로 테이블을 자동 생성합니다. 커넥터는 다음과 같은 합리적인 기본값을 제공합니다.
  • Engine: 지정하지 않으면 기본값으로 MergeTree()를 사용합니다. engine 옵션을 사용해 다른 엔진을 지정할 수 있습니다(예: ReplacingMergeTree(), SummingMergeTree() 등).
  • ORDER BY: 필수 - 새 테이블을 생성할 때는 반드시 order_by 옵션을 명시적으로 지정해야 합니다. 커넥터는 지정된 모든 컬럼이 스키마에 존재하는지 검증합니다.
  • 널 허용 키 지원: ORDER BY에 널 허용 컬럼이 포함되어 있으면 settings.allow_nullable_key=1을 자동으로 추가합니다
ORDER BY 필수: TableProvider API를 통해 새 테이블을 생성할 때는 order_by 옵션이 필수입니다. ORDER BY 절에 사용할 컬럼을 반드시 명시적으로 지정해야 합니다. 커넥터는 지정된 모든 컬럼이 스키마에 존재하는지 검증하며, 누락된 컬럼이 있으면 오류를 발생시킵니다.엔진 선택: 기본 엔진은 MergeTree()이지만, engine 옵션을 사용해 모든 ClickHouse 테이블 엔진을 지정할 수 있습니다(예: ReplacingMergeTree(), SummingMergeTree(), AggregatingMergeTree() 등).

TableProvider 연결 옵션

포맷 기반 API를 사용할 때는 다음 연결 옵션을 사용할 수 있습니다:

연결 옵션

테이블 생성 옵션

이 옵션은 테이블이 아직 없어서 새로 생성해야 할 때 사용됩니다:
  • 새 테이블을 생성할 때는 order_by 옵션이 필요합니다. 지정한 모든 컬럼은 스키마에 존재해야 합니다. ** ORDER BY에 널 허용 컬럼이 포함되어 있고 이 값이 명시적으로 지정되지 않으면 자동으로 1로 설정됩니다.
모범 사례: ClickHouse Cloud에서는 ORDER BY 컬럼이 널 허용일 수 있다면 settings.allow_nullable_key=1을 명시적으로 설정하십시오. ClickHouse Cloud에서는 이 설정이 필요합니다.

쓰기 모드

Spark 커넥터(TableProvider API와 Catalog API 모두)는 다음 Spark 쓰기 모드를 지원합니다.
  • append: 기존 테이블에 데이터를 추가합니다
  • overwrite: 테이블의 모든 데이터를 대체합니다(테이블을 TRUNCATE함)
파티션 단위 Overwrite는 지원되지 않습니다: 현재 커넥터는 파티션 수준의 overwrite 작업(예: partitionBy와 함께 사용하는 overwrite 모드)을 지원하지 않습니다. 이 기능은 현재 개발 중입니다. 진행 상황은 GitHub issue #34에서 확인하십시오.

ClickHouse 옵션 구성

Catalog API와 TableProvider API는 모두 ClickHouse 전용 옵션(커넥터 옵션 제외)의 구성을 지원합니다. 이러한 옵션은 테이블을 생성하거나 쿼리를 실행할 때 ClickHouse에 전달됩니다. ClickHouse 옵션을 사용하면 allow_nullable_key, index_granularity와 같은 ClickHouse 전용 설정과 그 밖의 테이블 수준 또는 쿼리 수준 설정을 구성할 수 있습니다. 이는 커넥터가 ClickHouse에 연결하는 방식을 제어하는 커넥터 옵션(host, database, table 등)과는 다릅니다.

TableProvider API 사용

TableProvider API에서는 settings.<key> 옵션 포맷을 사용합니다:

Catalog API 사용

Catalog API를 사용할 때는 Spark 구성에서 spark.sql.catalog.<catalog_name>.option.<key> 포맷을 사용하십시오:
또는 Spark SQL로 테이블을 생성할 때 설정할 수도 있습니다:

ClickHouse Cloud 설정

ClickHouse Cloud에 연결할 때는 SSL을 활성화하고 적절한 SSL 모드를 설정하십시오. 예시는 다음과 같습니다.

데이터 읽기

데이터 쓰기

파티션 덮어쓰기 미지원: Catalog API는 현재 파티션 수준의 덮어쓰기 작업(예: partitionBy를 사용하는 overwrite 모드)을 지원하지 않습니다. 이 기능은 현재 개발 중입니다. 진행 상황은 GitHub issue #34에서 확인하십시오.

DDL 작업

Spark SQL을 사용해 ClickHouse 인스턴스에서 DDL 작업을 수행할 수 있으며, 모든 변경 사항은 즉시 ClickHouse에 저장됩니다. Spark SQL에서는 ClickHouse에서와 동일하게 쿼리를 작성할 수 있으므로, 예를 들어 CREATE TABLE, TRUNCATE 등의 명령을 수정 없이 직접 실행할 수 있습니다:
Spark SQL을 사용할 때는 한 번에 하나의 SQL statement만 실행할 수 있습니다.
위의 예시는 Spark SQL 쿼리를 보여 주며, Java, Scala, PySpark 또는 셸 등 어떤 API로든 애플리케이션 내에서 실행할 수 있습니다.

VariantType 사용하기

VariantType 지원은 Spark 4.0+에서 제공되며, 실험적 JSON/Variant 타입을 활성화한 ClickHouse 25.3+가 필요합니다.
커넥터는 반정형 데이터를 다루기 위해 Spark의 VariantType을 지원합니다. VariantType은 ClickHouse의 JSONVariant 타입에 매핑되므로, 유연한 스키마의 데이터를 효율적으로 저장하고 쿼리할 수 있습니다.
이 섹션에서는 VariantType의 매핑과 사용법에 중점을 둡니다. 지원되는 모든 데이터 타입에 대한 전체 개요는 지원되는 데이터 타입 섹션을 참조하십시오.

ClickHouse 타입 매핑

VariantType 데이터 읽기

ClickHouse에서 데이터를 읽으면 JSONVariant 컬럼이 자동으로 Spark의 VariantType에 매핑됩니다.

VariantType 데이터 쓰기

JSON 또는 Variant 컬럼 타입을 사용해 VariantType 데이터를 ClickHouse에 쓸 수 있습니다:

Spark SQL로 VariantType 테이블 생성하기

Spark SQL DDL을 사용해 VariantType 테이블을 생성할 수 있습니다:

Variant 타입 구성하기

VariantType 컬럼이 포함된 테이블을 생성할 때 사용할 ClickHouse 타입을 지정할 수 있습니다:

JSON 타입 (기본값)

variant_types 속성을 지정하지 않으면 해당 컬럼은 기본적으로 ClickHouse의 JSON 타입을 사용하며, 이 타입은 JSON 객체만 허용합니다:
다음과 같은 ClickHouse 쿼리가 생성됩니다:

여러 타입을 지원하는 Variant Type

기본 타입, 배열, JSON 객체를 지원하려면 variant_types 속성에 타입을 지정합니다:
다음과 같은 ClickHouse 쿼리가 생성됩니다:

지원되는 Variant 타입

다음 ClickHouse 타입은 Variant()에서 사용할 수 있습니다.
  • 기본 타입: String, Int8, Int16, Int32, Int64, UInt8, UInt16, UInt32, UInt64, Float32, Float64, Bool
  • 배열: Array(T) — 여기서 T는 중첩 배열을 포함한 지원되는 모든 타입입니다
  • JSON: JSON 객체 저장용 JSON

읽기 포맷 구성

기본적으로 JSON 및 Variant 컬럼은 VariantType으로 읽힙니다. 이 동작은 재정의할 수 있으며, 문자열로 읽도록 설정할 수 있습니다.

쓰기 포맷 지원

VariantType의 쓰기 지원은 포맷에 따라 다릅니다: 쓰기 포맷을 설정합니다:
ClickHouse Variant 유형에 데이터를 써야 한다면 JSON 포맷을 사용하세요. Arrow 형식은 JSON 유형에만 쓸 수 있습니다.

모범 사례

  1. JSON 전용 데이터에는 JSON 타입 사용: JSON 객체만 저장한다면 기본 JSON 타입을 사용합니다(variant_types 속성 없음)
  2. 타입을 명시적으로 지정: Variant()를 사용할 때는 저장할 예정인 모든 타입을 명시적으로 나열합니다
  3. 실험적 기능 활성화: ClickHouse에서 allow_experimental_json_type = 1이 활성화되어 있는지 확인합니다
  4. 쓰기에는 JSON 포맷 사용: 더 나은 호환성을 위해 VariantType 데이터 쓰기에는 JSON 포맷을 권장합니다
  5. 쿼리 패턴 고려: JSON/Variant 타입은 효율적인 필터링을 위해 ClickHouse의 JSON 경로 쿼리를 지원합니다
  6. 성능을 위한 컬럼 힌트: ClickHouse에서 JSON 필드를 사용할 때 컬럼 힌트를 추가하면 쿼리 성능이 향상됩니다. 현재는 Spark를 통해 컬럼 힌트를 추가하는 기능을 지원하지 않습니다. 이 기능의 진행 상황은 GitHub issue #497에서 확인하십시오.

예시: 전체 워크플로

구성

다음은 커넥터에서 조정할 수 있는 구성입니다.
구성 사용: 다음은 Catalog API와 TableProvider API 모두에 적용되는 Spark 수준의 구성 옵션입니다. 설정하는 방법은 2가지입니다.
  1. 전역 Spark 구성 (모든 작업에 적용됨):
  2. 작업별 재정의 (TableProvider API 전용 - 전역 설정을 재정의할 수 있음):
또는 spark-defaults.conf에서 설정하거나 Spark 세션을 생성할 때 설정할 수 있습니다.

지원되는 데이터 타입

이 섹션에서는 Spark와 ClickHouse 간의 데이터 타입 매핑을 설명합니다. 아래 표는 ClickHouse에서 Spark로 데이터를 읽어올 때와 Spark에서 ClickHouse로 데이터를 삽입할 때의 데이터 타입 변환을 빠르게 참고할 수 있도록 정리한 것입니다.

ClickHouse에서 Spark로 데이터 읽기

Spark에서 ClickHouse로 데이터 삽입

기여 및 지원

프로젝트에 기여하거나 문제를 보고하려는 경우, 의견을 보내주시면 감사하겠습니다! 이슈를 등록하고, 개선 사항을 제안하고, pull request를 제출하려면 GitHub 리포지토리를 방문하십시오. 기여는 언제나 환영합니다! 시작하기 전에 리포지토리의 기여 가이드라인을 확인해 주십시오. ClickHouse Spark 커넥터 개선에 도움을 주셔서 감사합니다!
마지막 수정일 2026년 7월 24일