메인 콘텐츠로 건너뛰기

개요

ClickHouse는 Apache Arrow Flight 프로토콜을 지원합니다. 이 프로토콜은 gRPC를 통해 Arrow IPC 포맷을 사용해 열 지향 데이터를 효율적으로 전송할 수 있는 고성능 RPC 프레임워크입니다. 이 구현에는 Arrow Flight SQL 지원도 포함되어 있어, Flight SQL 프로토콜을 사용하는 BI 도구와 애플리케이션이 ClickHouse를 직접 쿼리할 수 있습니다. 주요 기능:
  • SQL 쿼리를 실행하고 결과를 Apache Arrow 형식으로 가져옵니다.
  • Arrow 형식을 사용해 테이블에 데이터를 삽입합니다.
  • Flight SQL 명령을 통해 메타데이터(카탈로그, 스키마, 테이블, 프라이머리 키)를 쿼리합니다.
  • Flight SQL을 통해 서버 측 prepared statement를 생성, 바인드, 실행, 종료합니다.
  • Flight SQL 작업을 통해 세션 및 설정을 관리합니다.
  • TLS 암호화와 사용자 이름/비밀번호 인증을 지원합니다.
  • PollFlightInfo를 통한 점진적 결과 조회.
  • CancelFlightInfo를 통한 쿼리 취소.

Arrow Flight 서버 활성화

Arrow Flight 서버를 활성화하려면 ClickHouse 서버 구성에 arrowflight_port 설정을 추가합니다:
시작되면 로그 메시지로 인터페이스가 활성화되었는지 확인할 수 있습니다:

TLS 구성

Arrow Flight 인터페이스에서 TLS를 활성화하려면 다음 설정을 지정하십시오:
TLS가 활성화된 경우 클라이언트는 grpc:// 대신 grpc+tls:// 스킴으로 연결해야 합니다.

인증

Arrow Flight 인터페이스는 두 가지 인증 메서드를 지원합니다:

기본 인증

클라이언트는 표준 HTTP Authorization: Basic 헤더를 사용해 사용자 이름과 비밀번호로 인증합니다. 인증에 성공하면 server는 응답 헤더에 Bearer 토큰을 반환합니다.

Bearer 토큰 인증

이후 요청에서는 기본 인증으로 반환된 Bearer 토큰을 Authorization: Bearer <token> 헤더를 통해 사용할 수 있습니다. 이 토큰은 사용할 때마다 자동으로 갱신되며, default_session_timeout 서버 설정에 따라 만료됩니다(기본값: 60초).

Python 예시

TLS 사용 시:

세션 관리

Arrow Flight 인터페이스는 사용자 지정 gRPC 메타데이터 헤더를 통해 ClickHouse 세션을 지원합니다.
Arrow Flight는 HTTP/2 기반 gRPC를 사용하므로 메타데이터 헤더 이름은 대소문자를 구분하며, 아래에 표시된 그대로 반드시 소문자로 지정해야 합니다(예: x-clickhouse-session-id, X-ClickHouse-Session-Id 아님). 이는 HTTP/2 필드 이름에 소문자만 포함되어야 한다고 규정한 RFC 9113, Section 8.2의 요구 사항입니다. 이는 헤더 이름이 대소문자를 구분하지 않는 HTTP/1.1과 다릅니다.
세션을 사용하면 SetSessionOptions action을 통해 ClickHouse 설정을 지속적으로 적용할 수 있습니다(DoAction 참조).

서버 구성 참고

지원되는 RPC 메서드

GetFlightInfo

쿼리를 실행하고 결과 스키마, 데이터 검색에 사용할 티켓이 포함된 엔드포인트, 행 수, 바이트 수를 담은 FlightInfo를 반환합니다. 다음 중 하나일 수 있는 FlightDescriptor를 받습니다:
  • PATH 디스크립터: table 이름으로 해석되는 단일 구성 요소 경로입니다. SELECT * FROM <table>를 생성합니다.
  • CMD 디스크립터: 원시 SQL 쿼리 문자열 또는 직렬화된 Flight SQL protobuf 명령입니다(Flight SQL Commands 참조).
쿼리는 전체가 실행되며, 결과는 서버 측 티켓에 저장됩니다. 각 데이터 block은 별도의 엔드포인트/티켓을 생성하므로, 클라이언트는 데이터를 병렬로 검색할 수 있습니다.

PollFlightInfo

장시간 실행되는 쿼리의 결과를 점진적으로 가져올 수 있도록 합니다. 전체 쿼리가 완료될 때까지 기다리는 GetFlightInfo와 달리, PollFlightInfo는 결과를 블록 단위로 반환합니다. 첫 번째 호출 시 쿼리 실행이 시작됩니다. 응답에는 다음이 포함됩니다:
  • 현재까지 사용 가능한 데이터 블록의 endpoint가 포함된 FlightInfo
  • 다음 폴링에 사용할 FlightDescriptor(추가 결과가 예상되는 경우)
이후에는 반환된 디스크립터로 추가 호출을 수행해 다음 블록들을 가져옵니다. 더 이상 사용할 수 있는 데이터가 없으면 응답에는 다음 디스크립터가 포함되지 않습니다.
현재 구현은 데이터 블록을 사용할 수 있을 때까지 대기하며, 데이터 없이 즉시 반환하지는 않습니다.

GetSchema

전체 쿼리를 실행하지 않고 쿼리 결과의 Arrow 스키마를 반환합니다. GetFlightInfo와 동일한 디스크립터 유형을 지원합니다.

DoGet

지정된 티켓에 대한 데이터를 가져옵니다. 다음 중 하나를 받습니다:
  • GetFlightInfo 또는 PollFlightInfo에서 반환된 티켓
  • 티켓 값으로 전달되는 원시 SQL 쿼리 문자열

DoPut

데이터를 ClickHouse로 전송합니다. FlightDescriptor와 Arrow 레코드 배치 스트림을 인수로 받습니다. 테이블 이름으로 삽입 (PATH 디스크립터):
SQL을 통한 삽입 (CMD 디스크립터):
Flight SQL CommandStatementUpdate를 통한 DDL/DML 실행: Flight SQL 클라이언트는 DDL/DML SQL 문(CREATE, INSERT, ALTER 등)을 실행할 때 CommandStatementUpdate를 사용합니다. 응답에는 영향을 받은 행 수가 포함됩니다. Flight SQL CommandStatementIngest를 통한 대량 수집: 기존 테이블에 데이터를 추가하는 작업만 지원됩니다(TABLE_NOT_EXIST_OPTION_FAIL + TABLE_EXISTS_OPTION_APPEND). 이 명령에서는 카탈로그와 임시 테이블을 지원하지 않습니다. transaction_idCommandStatementUpdateCommandStatementIngest 모두에서 지원되지 않습니다. 이를 제공하면 ClickHouse는 NotImplemented 오류를 반환합니다.
데이터 전송에는 Arrow 형식만 허용됩니다. SQL에서 다른 포맷을 지정하면(예: FORMAT JSON) 오류가 발생합니다.

DoAction

명명된 actions를 실행합니다. 지원되는 actions는 다음과 같습니다:

CancelFlightInfo

FlightInfo와 연결된 실행 중인 쿼리를 취소합니다. 쿼리 ID는 FlightInfoapp_metadata 필드에서 추출됩니다. 또한 해당 쿼리와 연결된 모든 폴링 디스크립터도 취소합니다.

SetSessionOptions

현재 세션의 ClickHouse 서버 설정을 지정합니다. x-clickhouse-session-id 헤더를 통해 세션 ID가 설정되어 있어야 합니다. 지원되는 값 타입: string, boolean, integer, double, string list입니다. 설정 이름을 인식할 수 없으면 오류 INVALID_NAME이 반환됩니다. 값을 파싱할 수 없으면 오류 INVALID_VALUE가 반환됩니다.

GetSessionOptions

현재 세션의 모든 ClickHouse 설정과 해당 값을 반환합니다. 설정 이름을 문자열 값에 매핑한 맵을 반환합니다(내부적으로 system.settings를 쿼리합니다).

CreatePreparedStatement

서버 측 prepared statement를 생성하고 statement handle을 반환합니다. 요청에는 ? 플레이스홀더가 포함된 SQL 쿼리 텍스트가 들어 있습니다. 이 작업에서는 transaction_id를 지원하지 않습니다. 이를 제공하면 ClickHouse는 NotImplemented 오류를 반환합니다. 쿼리 SQL 문의 경우 응답에 다음이 포함될 수 있습니다:
  • dataset_schema: result set의 스키마
  • parameter_schema: SQL 문 매개변수의 스키마
유효한 쿼리에서 스키마 추론이 실패하더라도(예를 들어 플레이스홀더를 NULL로 대체하는 것이 해당 쿼리에서 유효하지 않은 경우) ClickHouse는 여전히 prepared statement를 생성하고 dataset_schema 없이 handle을 반환합니다. Prepared statements는 단일 세션이 아니라 인증된 사용자가 소유합니다. 동일한 사용자로 여러 세션을 열면 그 세션들 중 어느 세션에서든 동일한 statement handle을 실행, 다시 바인드, 종료할 수 있습니다. 다른 사용자는 자신이 생성하지 않은 statement handle을 실행, 바인드 또는 종료할 수 없습니다. arrowflight.prepared_statements_lifetime_seconds는 만료 동작을 제어합니다:
  • > 0: 구성된 값을 statement의 수명으로 사용합니다. 세션에 바인딩된 statement와 세션이 없는 statement 모두에서 각 요청 시 만료 시간이 갱신됩니다.
  • 0: prepared statements는 자동으로 만료되지 않습니다.
  • -1 (기본값): statement가 세션에서 생성되면 수명은 해당 세션 timeout을 따르며, 그 세션의 각 요청 시 갱신됩니다. statement가 세션 없이 생성되면 자동으로 만료되지 않습니다.
만료된 statements는 제거되며 더 이상 arrowflight.max_prepared_statements_per_user에 포함되지 않습니다.

ClosePreparedStatement

요청에 비어 있지 않은 statement handle이 포함된 경우 prepared statement를 닫고, 관련 서버 측 리소스를 해제합니다. ClickHouse는 handle이 비어 있을 때 ClosePreparedStatement를 사용한 일괄 종료도 지원합니다.
  • x-clickhouse-session-id가 있으면 해당 세션에서 인증된 사용자의 모든 prepared statement를 닫습니다.
  • 세션 ID가 없으면 인증된 사용자의 세션 없는 prepared statement만 닫습니다.
prepared statement가 세션(x-clickhouse-session-id를 통해)에서 생성된 경우, 해당 세션이 종료될 때 자동으로 함께 닫힙니다.

Flight SQL 명령

CMD 디스크립터에 직렬화된 Flight SQL protobuf 메시지가 포함된 경우, ClickHouse는 다음 명령을 처리합니다:

GetFlightInfo / GetSchema에서 지원

DoPut을 통해 지원됩니다

ClickHouse에서 지원되지 않음

다음 명령은 ClickHouse에서 제공하지 않는 기능에 해당하므로 Arrow Flight SQL 인터페이스에서 지원되지 않습니다.

전체 예시

Query
Response

데이터 포맷

모든 데이터는 Apache Arrow IPC 포맷으로 전송됩니다. Arrow 형식만 지원되며, 다른 ClickHouse 포맷(예: FORMAT JSON, FORMAT CSV)을 지정하면 오류가 발생합니다. 직렬화 시 ClickHouse 데이터 타입은 Arrow 타입으로 매핑됩니다. 설정 output_format_arrow_unsupported_types_as_binary는 지원되지 않는 ClickHouse 타입을 바이너리 blob으로 직렬화할지 여부를 제어합니다.

호환성

Arrow Flight 인터페이스는 Arrow Flight 또는 Arrow Flight SQL 프로토콜을 지원하는 모든 클라이언트나 도구와 호환됩니다. 예를 들면 다음과 같습니다.
  • Python (pyarrow)
  • Java (org.apache.arrow.flight)
  • C++ (arrow::flight)
  • Go (apache/arrow/go)
  • ADBC (Arrow Database Connectivity) 드라이버
  • DBeaver 및 Flight SQL을 지원하는 기타 도구
사용하는 도구에 네이티브 ClickHouse 커넥터가 있다면(예: JDBC, ODBC, 네이티브 프로토콜), 성능 또는 포맷 호환성 때문에 Arrow Flight가 특별히 필요한 경우가 아니라면 해당 커넥터를 사용하는 것이 좋습니다.

클라이언트 측 ArrowFlight 기능

ClickHouse는 외부 Arrow Flight 서버에서 데이터를 읽는 Flight 클라이언트로도 사용할 수 있습니다. 다음을 참조하십시오.

관련 항목

마지막 수정일 2026년 7월 2일