概述
- 执行 SQL 查询,并以 Apache Arrow 格式返回结果。
- 使用 Arrow 格式向表中插入数据。
- 通过 Flight SQL 命令查询元数据 (目录、schema、表、主键) 。
- 通过 Flight SQL 创建、绑定、执行和关闭服务器端预处理语句。
- 通过 Flight SQL 操作管理会话和设置。
- 支持 TLS 加密以及用户名/密码身份验证。
- 通过
PollFlightInfo增量获取结果。 - 通过
CancelFlightInfo取消查询。
启用 Arrow Flight Server
arrowflight_port 设置添加到 ClickHouse server 配置中:
TLS 配置
grpc+tls:// 协议进行连接,而不能使用 grpc://。
身份验证
基本身份验证
Authorization: Basic 请求头,使用用户名和密码进行身份验证。身份验证成功后,服务器会在响应头中返回一个 Bearer 令牌。
Bearer 令牌身份验证
Authorization: Bearer <token> 请求头,使用 Basic 身份验证返回的 Bearer 令牌。该令牌每次使用时都会自动刷新,并会根据 default_session_timeout 服务器设置过期 (默认值:60 秒) 。
Python 示例
会话管理
由于 Arrow Flight 使用基于 HTTP/2 的 gRPC,元数据请求头名称区分大小写,且必须完全按如下所示使用小写形式 (例如
x-clickhouse-session-id,而不是 X-ClickHouse-Session-Id) 。这是 RFC 9113 第 8.2 节的要求;该规范规定 HTTP/2 字段名称只能包含小写字符。这与 HTTP/1.1 不同,因为在 HTTP/1.1 中,请求头名称不区分大小写。SetSessionOptions 操作持久化设置 ClickHouse 设置 (参见 DoAction) 。
服务器配置参考
支持的 RPC 方法
GetFlightInfo
FlightInfo,其中包含结果 schema、用于检索数据的带 ticket 的端点、行数以及字节数。
接受一个 FlightDescriptor,其可以是:
- PATH 描述符:仅包含一个组件的 path,会被解释为表名。会生成
SELECT * FROM <table>。 - CMD 描述符:原始 SQL 查询字符串,或序列化后的 Flight SQL protobuf 命令 (参见 Flight SQL Commands) 。
PollFlightInfo
GetFlightInfo 需要等待整个查询完成不同,PollFlightInfo 会按块返回结果。
首次调用时,查询会开始执行。响应包括:
- 一个
FlightInfo,其中包含截至当前所有可用数据块的端点。 - 一个用于下一次轮询的
FlightDescriptor(如果预计还会有更多结果) 。
当前实现会阻塞,直到有数据块可用,而不是在没有数据时立即返回。
GetSchema
GetFlightInfo 相同的描述符类型。
DoGet
- 由
GetFlightInfo或PollFlightInfo返回的 ticket。 - 作为 ticket 值提供的原始 SQL 查询字符串。
DoPut
FlightDescriptor 和 Arrow 记录批次流。
按表名插入 (PATH 描述符) :
CommandStatementUpdate 执行 DDL/DML:
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 关联的正在执行的查询。查询 ID 从 FlightInfo 的 app_metadata 字段中提取。还会取消与该查询关联的所有轮询描述符。
SetSessionOptions
x-clickhouse-session-id 请求头指定会话 ID。
支持的值类型:string、boolean、integer、double 以及字符串列表。
如果设置名称未知,则返回错误 INVALID_NAME。如果值无法解析,则返回错误 INVALID_VALUE。
GetSessionOptions
system.settings) 。
CreatePreparedStatement
? 占位符的 SQL 查询文本。
此操作不支持 transaction_id。如果提供了该参数,ClickHouse 会返回 NotImplemented 错误。
对于查询语句,响应可能包括:
dataset_schema:结果集的 schema。parameter_schema:语句参数的 schema。
NULL 对该查询无效时) ,ClickHouse 仍会创建预处理语句,并返回不包含 dataset_schema 的句柄。
预处理语句归已通过身份验证的用户所有,而不归属于某个单独的会话。如果你以同一用户身份打开多个会话,则可以在其中任意一个会话中执行、重新绑定和关闭同一个语句句柄。
其他用户不能执行、绑定或关闭不是由自己创建的语句句柄。
arrowflight.prepared_statements_lifetime_seconds 用于控制过期行为:
> 0:使用配置值作为语句的生命周期。对于绑定到会话和无会话的语句,每次请求都会刷新过期时间。0:预处理语句不会自动过期。-1(默认) :如果语句是在会话中创建的,其生命周期遵循该会话的 timeout,并在该会话中的每次请求时刷新。如果语句是在没有会话的情况下创建的,则不会自动过期。
arrowflight.max_prepared_statements_per_user。
ClosePreparedStatement
ClosePreparedStatement 进行批量关闭:
- 如果存在
x-clickhouse-session-id,则会关闭该 session 中该已认证用户的所有预处理语句。 - 如果不存在 session ID,则只会关闭该已认证用户未绑定到任何 session 的预处理语句。
x-clickhouse-session-id) ,那么当该 session 关闭时,该语句也会自动关闭。
Flight SQL 命令
CMD 描述符中包含序列化后的 Flight SQL protobuf 消息时,ClickHouse 会处理以下命令:
通过 GetFlightInfo / GetSchema 支持的命令
通过 DoPut 支持
ClickHouse 中不支持的功能
完整示例
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 的工具