跳转至

Arrow 结果传输:如何启用、如何配置、哪些环节会变快

Dosi 可以用 Apache Arrow 传输查询结果。对于线上格式本来就是列式的引擎 (DuckDB、ClickHouse、StarRocks/Doris、Databricks),能做到端到端列式。 这一页是使用指南:要配置什么、要构建什么、哪些 API 会变快。背后的调研、 支持矩阵和推进计划见 design/arrow-adbc.md; 连接器的配置细节见 connectors.md

0. 已锁定的范围(2026-07-12)

本轮支持 Arrow 通路的:DuckDB(第一优先级,内置 crate 的磁盘占用问题已解决)、 ClickHouse、StarRocks、Doris、Databricks。 Snowflake 与 BigQuery 合并成一个待办:两者都会走未来的通用 exec-adbc 通道。 它们的 ADBC 驱动由同一个组织(ADBC Driver Foundry)以 Go .so 的形式维护, Snowflake 的已 Stable,BigQuery 的仍是 Experimental,所以只是在等 BigQuery。 Trino/MySQL/TiDB/Redshift:没有 Arrow 通路,已放弃。 它们的线上格式面向行,在客户端做一次列转置毫无收益。

1. 我需要改配置吗?

基本不用。 现有的连接配置文件原样继续可用;行通路在各处仍是默认,行为完全一致。

引擎 为启用 Arrow 需要的配置改动
DuckDB 无。进程内 Arrow 自动成为该引擎的原生通路
ClickHouse 无。还是那份 HTTP 配置,适配器会自己请求 FORMAT ArrowStream
Databricks 除常规配置(hostwarehousepassword: = PAT)外无需改动,该执行器从第一天起就是 Arrow 优先
StarRocks 一个键arrow_flight_port: 9408(FE 的 arrow_flight_port;需要 SR ≥ 3.5.1)。有这个键 = 走 Flight SQL;没有 = 完全和今天一样走 MySQL 协议
Doris 一个键arrow_flight_port: 8070(FE 的 arrow_flight_sql_port;建议 Doris ≥ 2.1.5)。同样的显式启用规则

示例:

datasources:
  prod-sr:
    type: starrocks
    host: sr.internal
    port: 9030                # MySQL-wire port, still used as fallback/seeding
    arrow_flight_port: 9408   # presence opts this profile into Arrow Flight SQL
    username: osi
    password: ${SR_PASSWORD}
    database: analytics

这里刻意没有 result_format: 这类开关:每个适配器只有一种原生解码方式, 而出口格式是按请求选择的(Accept 头/CLI 参数),不是按数据源选择的。

2. 构建时如何启用?

Feature 它开启了什么 在默认构建里?
exec-duckdb 内置 libduckdb,进程内,原生 Arrow (新的默认;--no-default-features = 今天那种通过 CLI 外调的精简构建)
exec-http-arrow ClickHouse 的 FORMAT ArrowStream 否(隐含 exec-http
exec-flightsql StarRocks/Doris 的 Arrow Flight SQL 客户端(tonic/tokio,按开关引入)
exec-databricks Databricks Statement Execution API,INLINE JSON_ARRAY 行
exec-databricks-arrow Databricks 的 ARROW_STREAM + EXTERNAL_LINKS(arrow-ipc) 否(隐含 exec-databricks
exec-all 以上全部
dosi-server 的 arrow /v1/query/execute 上的 Arrow IPC 响应 (服务端默认)

3. 哪些 API 会变快,快多少?

  • POST /v1/query/execute 且带 Accept: application/vnd.apache.arrow.stream: 最大的收益点。批次从数仓适配器直接以 Arrow IPC 流进 HTTP body, 服务端不再逐值做 JSON 编码,客户端不再做 JSON 解析,列式消费方 (Polars/pandas/DataFusion/另一个 Dosi)零解析就能读。既有客户端拿到的 JSON 响应逐字节不变。收益随结果规模放大:10 行的聚合可以忽略不计, 高基数分组和明细/导出类查询(10⁵ 行以上)则是决定性的。
  • dosi query --execute --format arrow:在 stdout 上给出 Arrow IPC, 可直接管进 DuckDB、Polars 或任何工具,完全跳过表格/JSON 渲染。
  • StarRocks/Doris 的大结果读取:Flight SQL 绕开了 FE 的行转发, 客户端并行地从各 BE 拉列式结果。厂商测得大结果集上相比 MySQL 协议有 20–160 倍差距;小聚合基本无变化。
  • ClickHouse:服务端的 Arrow 序列化(lz4 分帧)取代了两端的 JSON 编解码, 也省掉了 float/decimal 的文本往返转换。
  • DuckDB(默认引擎):进程内零拷贝取代了"每次查询启一个 CLI + 解析 JSON", 每一次 --execute 的延迟都更低,内存数据库也终于能在一个会话的多条语句间 保持存在。
  • 哪些不会变快:只做编译的 API(/v1/query/compileexplain)根本不接触结果; 面向行协议的引擎(MySQL/TiDB/Postgres/Trino)上的小指标查询按设计就不变。

每条 Arrow 通路在发布前都要通过语料一致性校验:同样的 45 个用例, Arrow 结果 ≡ 行结果 ≡ DuckDB 参考结果。