跳转至

StarRocks 连接器

StarRocks 通过 FE 的 MySQL 协议端口接入,用的是和 MySQL 相同的适配器——文本协议、池化连接、共享的 ResultSet 归一——编译出的 SQL 按 StarRocks 方言生成,它保留了 FULL OUTER JOIN(这一点和 MySQL、TiDB 不同)。

StarRocks 还有一条更快的路径:加一个键,查询就走 Arrow Flight SQL——FE 负责规划,客户端直接从各个 BE 拉 Arrow 批次,全程列式,不再经 FE 做行序列化。

exec-mysql 控制,Arrow 路径还需要 exec-flightsql

连接配置

datasources:
  prod-sr:
    type: starrocks
    host: sr.internal
    port: 9030               # FE 的 MySQL 协议端口
    username: dosi
    password: ${SR_PASSWORD}
    database: analytics

开启 Arrow Flight SQL:

    arrow_flight_port: 9408  # FE 的 arrow_flight_port;写上就切到 Flight SQL

参数

类型 必填 默认 说明
type string starrocks
host string 是* *除非给了 uri:。同时也是 Flight SQL 的主机。
port int 3306(驱动默认) FE 的 MySQL 端口——通常是 9030,显式写上。
username string 也是 Flight SQL 握手用的用户,那里不写默认是 root
password string 尽量用 ${VAR}
database string Flight 路径下会在握手之后以 USE <database> 应用。
arrow_flight_port int 写上它就换执行器。 取 FE 的 arrow_flight_port(StarRocks ≥ 3.5.1)。删掉这个键就回落到 MySQL 线协议。
uri string mysql:// DSN。注意它会取代 host/port/username/password/database——写了 uri: 之后离散键都不生效。
default bool false 连接配置

本连接器解析但不使用的键: sslmodesslrootcert(MySQL 路径和 Flight 路径都没有 TLS)、schemacatalogaccountrolewarehousecompat_mode

Arrow 原生结果

加上 arrow_flight_port: 就是全部配置改动——收益见 Arrow。随之而来有三条运维上的规则:

  • 客户端必须能直连 BE。 FE 会把每个 BE 自己的地址交给客户端去拉数据。Docker 环境下把 BE 的 Flight 端口 1:1 发布出来(9419:9419),否则就用 FE 代理兜底(arrow_flight_proxy* 会话变量)。
  • 建库和灌数走 MySQL 线协议。 在 StarRocks 4.0 上,库级 DDL(CREATE/DROP DATABASE)在 Flight 端点会被拒;表级 DDL 和 DML 能到分析器。配置里保留 port:,就等于保留了这条兜底路径。
  • FE 的 Flight 服务在刚启动时可能会重置第一条连接;适配器会自动重连一次。

构建里没有 exec-flightsql 时,这个键会直接报错,而不是悄悄降级:datasource "x" sets arrow_flight_port but this build lacks the exec-flightsql feature

已知限制

  • StarRocks 3.3 没有 NTH_VALUE——用到 nth_value 的窗口在这个方言下会在编译期被拒。FIRST_VALUE/LAST_VALUE 不受影响。
  • 没有三参数 DATEDIFF;写成单位在前的形式会在这个方言下被拒。
  • 两条路径都没有 TLS。

本地验证连接

$ dosi query --model model.yaml \
    --metrics revenue --group-by orders.status --execute --connection prod-sr

想确认走的是哪条路径,就删掉或加回 arrow_flight_port:——只有这个键存在、且构建带了 exec-flightsql 时才走 Flight SQL。

排错

报错 原因与处理
datasource "x" sets arrow_flight_port but this build lacks the exec-flightsql feature --features exec-flightsql(或 exec-all)重新构建,或者删掉这个键。
datasource "x": missing arrow_flight_port 选中了 Flight 执行器却没有端口——通常是把值清空了而不是把键删掉。
flight sql connect: <e> FE 的 Flight 端口不可达,或者它给出的地址在这台客户端上路由不到。
flight sql handshake: <e> Flight 服务拒绝了这组凭据。
flight sql: <message> FE 对这条语句的原始报错——库级 DDL 走 Flight 就落在这里。
cannot reach server: <io error> MySQL 路径:主机、端口或网络。记住 FE 端口是 9030。
server rejected SQL (<code>): <message> StarRocks 拒了编译出的语句。

参考链接