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:
参数¶
| 键 | 类型 | 必填 | 默认 | 说明 |
|---|---|---|---|---|
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 |
见连接配置。 |
本连接器解析但不使用的键: sslmode、sslrootcert(MySQL 路径和 Flight 路径都没有 TLS)、schema、catalog、account、role、warehouse、compat_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 拒了编译出的语句。 |
参考链接¶
- 官网:https://www.starrocks.io/
- 连接配置:列式路径见 Arrow Flight SQL,账号见 CREATE USER,FE 端口见 StarRocks 快速开始
- 同一个适配器:Apache Doris · MySQL · TiDB
- Arrow · 连接配置