跳转至

Trino 连接器

Trino 通过它的 REST 客户端协议接入:Dosi 向 /v1/statement 发起请求,然后一路跟着 nextUri 轮询到查询结束,轮询退避是 50 → 200 毫秒。在这套协议里 HTTP 503 表示"忙,稍后再问",会重试约十秒才作为超时抛出。

这里没有连接池——一个保活的 HTTP 客户端,连接超时 10 秒、请求超时 60 秒。由 exec-http 控制。

连接配置

datasources:
  trino:
    type: trino
    host: trino.internal
    port: 8080
    username: dosi          # 作为 X-Trino-User 发送
    catalog: hive           # 会话 catalog,编译出的 schema.table 名在它下面解析
    schema: sales           # 可选的会话 schema

uri: http://trino.internal:8080 可以替代 host:/port:

参数

类型 必填 默认 说明
type string trino
uri string 是* *或者给 host:。带 scheme 的 coordinator 端点。
host string 是* *或者给 uri:。拼成 http://<host>:<port>——固定是 http,所以走 HTTPS 的 coordinator 必须显式写 uri:
port int 8080 只有从 host: 拼端点时才用到。
username string osi 作为 X-Trino-User 发送。这个默认值只是兜底,不是推荐——请显式设置。
catalog string 会话 catalog,作为 X-Trino-Catalog 发送。
schema string 会话 schema,作为 X-Trino-Schema 发送。
database string 另一种写法:用一个键写 catalogcatalog.schema。两者都给时,database: 优先。
default bool false 连接配置

本连接器解析但不使用的键: password——完全不会发送任何认证头,所以要求密码或 JWT 认证的 coordinator 目前还连不上——以及 sslmodesslrootcertarrow_flight_portaccountrolewarehousecompat_mode

HTTPS 需要带 TLS 的构建

ClickHouse 一样,只启用 exec-http 时链接进去的 HTTP 客户端不带 TLS。官方二进制带 exec-all,不受影响;自己编译的要加 --features exec-all

已知限制

  • 没有三参数 DATEDIFF Trino 把它写作 date_diff,所以按单位在前的 DATEDIFF 写法在这个方言下会在编译期被拒。
  • 没有认证。 见上面那条"解析但不使用"的说明。
  • 没有 Arrow 路径。 Trino 的 spooled 协议基于 JSON,它的 Arrow 支持还没进上游,所以结果是按行传回来的。

时间戳会替你归一:Trino 会把它补齐到声明精度并附上时区名称,解码器会把它规整成其它引擎产出的同一种无时区形态。

本地验证连接

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

排错

报错 原因与处理
connection "x" (trino) is missing required field "uri" uri:host:
trino rejected SQL (<errorName>): <message> coordinator 拒了这条语句;catalog 或 schema 没写对会出现在这里。
trino kept responding 503 (busy) for over 10s 集群饱和或还在启动;等它有容量了再试。
bad trino response: <e> 端点不是 Trino coordinator,或者被代理改写了响应。
HTTP 401: <body> coordinator 要求认证,而这个连接器不发认证信息。
cannot reach server: <e> 主机、端口或网络。

参考链接