Обзор
- Выполнение SQL-запросов и получение результатов в формате Apache Arrow.
- Вставка данных в таблицы с использованием формата Arrow.
- Запрос метаданных (каталогов, схем, таблиц, первичных ключей) через команды Flight SQL.
- Создание, связывание, выполнение и закрытие серверных подготовленных операторов через Flight SQL.
- Управление сеансами и настройками через действия Flight SQL.
- Шифрование TLS и аутентификация по имени пользователя и паролю.
- Поэтапное получение результатов через
PollFlightInfo. - Отмена запросов через
CancelFlightInfo.
Включение сервера Arrow Flight
arrowflight_port в конфигурацию сервера ClickHouse:
Настройка TLS
grpc+tls:// вместо grpc://.
Аутентификация
Базовая аутентификация
Authorization: Basic. При успешной аутентификации server возвращает Bearer-токен в заголовке ответа.
Аутентификация с Bearer-токеном
Authorization: Bearer <token>. Токен автоматически обновляется при каждом использовании и действует до истечения времени, заданного настройкой сервера default_session_timeout (по умолчанию — 60 секунд).
Пример на Python
Управление сеансами
| Заголовок | Описание |
|---|---|
x-clickhouse-session-id | Идентификатор сеанса. Если указан, несколько запросов используют одно и то же состояние сеанса (временные таблицы, настройки). |
x-clickhouse-session-timeout | Тайм-аут сеанса в секундах. Не должен превышать max_session_timeout. |
x-clickhouse-session-check | Установите значение 1, чтобы проверить, существует ли сеанс, не создавая его. |
x-clickhouse-session-close | Установите значение 1, чтобы закрыть сеанс после завершения запроса. Для этого в конфигурации сервера параметр enable_arrow_close_session должен быть установлен в true. |
Поскольку Arrow Flight использует gRPC поверх HTTP/2, имена заголовков метаданных учитывают регистр и должны быть указаны строчными буквами точно так, как показано (например,
x-clickhouse-session-id, а не X-ClickHouse-Session-Id). Это требование RFC 9113, раздел 8.2, согласно которому имена полей HTTP/2 должны содержать только строчные символы. В отличие от этого, в HTTP/1.1 имена заголовков регистронезависимы.SetSessionOptions (см. DoAction).
Справочник по конфигурации сервера
| Параметр | По умолчанию | Описание |
|---|---|---|
arrowflight_port | — | Порт сервера Arrow Flight. Сервер запускается только при указании этого параметра. |
arrowflight.enable_ssl | false | Включает шифрование TLS. |
arrowflight.ssl_cert_file | — | Путь к файлу TLS-сертификата. Обязателен, если TLS включен. |
arrowflight.ssl_key_file | — | Путь к файлу TLS private key. Обязателен, если TLS включен. |
arrowflight.tickets_lifetime_seconds | 600 | Время в секундах до истечения срока действия тикетов Flight и их удаления. Установите 0, чтобы отключить автоматическое истечение срока действия тикетов. |
arrowflight.cancel_ticket_after_do_get | false | Если true, тикеты отменяются сразу после получения через DoGet, что освобождает память. |
arrowflight.poll_descriptors_lifetime_seconds | 600 | Время в секундах до истечения срока действия дескрипторов опроса. Установите 0, чтобы отключить автоматическое истечение срока действия. |
arrowflight.cancel_flight_descriptor_after_poll_flight_info | false | Если true, дескрипторы опроса отменяются после использования в PollFlightInfo. |
arrowflight.max_prepared_statements_per_user | 100 | Максимальное количество открытых подготовленных операторов на пользователя. Установите 0, чтобы отключить ограничение. |
arrowflight.prepared_statements_lifetime_seconds | -1 | Режим времени жизни подготовленных операторов. > 0: использовать это значение как время жизни и обновлять срок действия при каждом запросе как для операторов, привязанных к сеансу, так и для операторов, не привязанных к сеансу. 0: отключить автоматическое истечение срока действия. -1: для операторов, привязанных к сеансу, использовать тайм-аут сеанса в качестве времени жизни и обновлять его при каждом запросе; операторы, не привязанные к сеансу, не истекают автоматически. |
enable_arrow_close_session | true | Разрешает клиентам закрывать сеансы через заголовок x-clickhouse-session-close. |
default_session_timeout | 60 | Тайм-аут сеанса по умолчанию в секундах. Также определяет срок действия Bearer-токена. |
max_session_timeout | 3600 | Максимально допустимый тайм-аут сеанса в секундах. |
Поддерживаемые методы RPC
GetFlightInfo
FlightInfo, содержащий схему результата, конечные точки с тикетами для получения данных, число строк и число байтов.
Принимает FlightDescriptor, который может быть одним из следующих:
- дескриптор PATH: Путь с одним компонентом, интерпретируемый как имя таблицы. Генерирует
SELECT * FROM <table>. - дескриптор CMD: Либо исходную строку SQL-запроса, либо сериализованную protobuf-команду Flight SQL (см. Команды Flight SQL).
PollFlightInfo
GetFlightInfo), PollFlightInfo возвращает результаты блоками.
При первом вызове запрос начинает выполняться. Ответ включает:
FlightInfoс конечными точками для всех блоков данных, доступных на текущий момент.FlightDescriptorдля следующего опроса (если ожидаются дополнительные результаты).
Текущая реализация ждёт, пока не станет доступен блок данных, вместо того чтобы сразу возвращать ответ без данных.
GetSchema
GetFlightInfo.
DoGet
- Тикет, возвращённый
GetFlightInfoилиPollFlightInfo. - Необработанную строку SQL-запроса в качестве значения тикета.
DoPut
FlightDescriptor и поток батчей записей Arrow.
Вставка по имени таблицы (дескриптор PATH):
CommandStatementUpdate:
Клиенты Flight SQL используют CommandStatementUpdate для выполнения DDL/DML-команд (CREATE, INSERT, ALTER и т. д.). В ответе возвращается количество затронутых строк.
Пакетный приём через Flight SQL CommandStatementIngest:
Поддерживается только добавление данных в существующие таблицы (TABLE_NOT_EXIST_OPTION_FAIL + TABLE_EXISTS_OPTION_APPEND). Каталоги и временные таблицы для этой команды не поддерживаются.
transaction_id не поддерживается для CommandStatementUpdate и CommandStatementIngest. Если он указан, ClickHouse возвращает ошибку NotImplemented.
Для передачи данных поддерживается только формат
Arrow. Указание других форматов в SQL (например, FORMAT JSON) приводит к ошибке.DoAction
CancelFlightInfo
FlightInfo. Идентификатор запроса извлекается из поля app_metadata объекта FlightInfo. Также отменяет все дескрипторы опроса, связанные с этим запросом.
SetSessionOptions
x-clickhouse-session-id.
Поддерживаемые типы значений: string, boolean, integer, double и списки строк.
Если имя настройки неизвестно, возвращается ошибка INVALID_NAME. Если значение не удаётся разобрать, возвращается ошибка INVALID_VALUE.
GetSessionOptions
system.settings).
CreatePreparedStatement
?.
transaction_id для этого действия не поддерживается. Если он указан, ClickHouse возвращает ошибку NotImplemented.
Для операторов запроса ответ может включать:
dataset_schema: схема результирующего набора.parameter_schema: схема параметров оператора.
NULL недопустима для этого запроса), ClickHouse всё равно создаёт подготовленный оператор и возвращает дескриптор без dataset_schema.
Подготовленные операторы принадлежат аутентифицированному пользователю, а не отдельному сеансу. Если вы открываете несколько сеансов от имени одного и того же пользователя, вы можете выполнять, повторно привязывать и закрывать один и тот же дескриптор оператора из любого из этих сеансов.
Другие пользователи не могут выполнять, привязывать или закрывать дескриптор оператора, который они не создавали.
arrowflight.prepared_statements_lifetime_seconds управляет поведением при истечении срока действия:
> 0: использовать настроенное значение как время жизни оператора. Срок действия обновляется при каждом запросе как для операторов, привязанных к сеансу, так и для операторов без сеанса.0: подготовленные операторы не истекают автоматически.-1(по умолчанию): если оператор создан в сеансе, его время жизни соответствует тайм-ауту этого сеанса и обновляется при каждом запросе в этом сеансе. Если оператор создан без сеанса, он не истекает автоматически.
arrowflight.max_prepared_statements_per_user.
ClosePreparedStatement
ClosePreparedStatement, когда дескриптор пуст:
- Если указан
x-clickhouse-session-id, закрываются все подготовленные операторы аутентифицированного пользователя в этом сеансе. - Если идентификатор сеанса не указан, закрываются только подготовленные операторы без сеанса для аутентифицированного пользователя.
x-clickhouse-session-id), он также автоматически закрывается при закрытии этого сеанса.
Команды Flight SQL
CMD содержит сериализованное сообщение Flight SQL protobuf, ClickHouse обрабатывает следующие команды:
Поддерживаются через GetFlightInfo / GetSchema
| Команда | Описание |
|---|---|
CommandStatementQuery | Выполняет произвольный SQL-запрос. transaction_id не поддерживается. |
CommandGetSqlInfo | Возвращает метаданные сервера (имя, версия, версия Arrow, возможности). |
CommandGetCatalogs | Возвращает список каталогов. Результат пустой (ClickHouse не использует каталоги). |
CommandGetDbSchemas | Возвращает список баз данных. Поддерживает необязательный параметр db_schema_filter_pattern (шаблон SQL LIKE). |
CommandGetTables | Возвращает список таблиц. Поддерживает фильтры по схеме, имени таблицы, типам таблиц, а также необязательное включение схемы. |
CommandGetTableTypes | Возвращает список типов движков таблиц (из system.table_engines). |
CommandGetPrimaryKeys | Возвращает столбцы первичного ключа для указанной таблицы. |
CommandPreparedStatementQuery | Выполняет подготовленный оператор типа SELECT по дескриптору. |
Поддерживается через DoPut
| Command | Description |
|---|---|
CommandStatementUpdate | Выполняет оператор DDL/DML (CREATE, INSERT, ALTER и т. д.). Возвращает количество затронутых строк. transaction_id не поддерживается. |
CommandStatementIngest | Выполняет массовую вставку данных Arrow в существующую таблицу. Поддерживается только режим добавления. transaction_id не поддерживается. |
CommandPreparedStatementQuery | При отправке через DoPut привязывает значения параметров для подготовленного оператора, а затем возвращает DoPutPreparedStatementResult с дескриптором оператора. Принимается только один набор параметров (одна строка), и количество привязанных значений должно точно соответствовать количеству плейсхолдеров ?. |
CommandPreparedStatementUpdate | Выполняет подготовленный оператор DDL/DML по дескриптору и возвращает количество затронутых строк. |
Не поддерживается в ClickHouse
| Команда | Причина |
|---|---|
CommandGetCrossReference | ClickHouse не является реляционной базой данных и не поддерживает ограничения внешних ключей, поэтому метаданные перекрёстных ссылок недоступны. |
CommandGetExportedKeys | ClickHouse не является реляционной базой данных и не поддерживает ограничения внешних ключей, поэтому метаданные экспортируемых ключей недоступны. |
CommandGetImportedKeys | ClickHouse не является реляционной базой данных и не поддерживает ограничения внешних ключей, поэтому метаданные импортируемых ключей недоступны. |
CommandStatementSubstraitPlan | ClickHouse не поддерживает планы Substrait. |
Полный пример
Query
Response
Формат данных
Arrow — указание других форматов ClickHouse (например, FORMAT JSON, FORMAT CSV) приводит к ошибке.
При сериализации типы данных ClickHouse сопоставляются с типами Arrow. Параметр output_format_arrow_unsupported_types_as_binary определяет, будут ли неподдерживаемые типы ClickHouse сериализоваться как бинарные BLOB-объекты.
Совместимость
- Python (
pyarrow) - Java (
org.apache.arrow.flight) - C++ (
arrow::flight) - Go (
apache/arrow/go) - драйверы ADBC (Arrow Database Connectivity)
- DBeaver и другие инструменты с поддержкой Flight SQL