K8s环境Trino集群JDBC报Query not found错误,求排查修复方案
Trino JDBC查询404错误的原因与修复方案
错误核心原因
从报错信息和"CLI正常、JDBC异常"的差异来看,主要集中在会话路由一致性和客户端配置上,具体可能的原因:
- JDBC未启用会话亲和性:K8s Service(或Envoy代理)默认轮询负载均衡,Trino查询状态仅保存在执行查询的Coordinator节点上。JDBC后续拉取结果时如果被路由到其他Coordinator,就会找不到对应查询,返回404。而CLI默认和单个Coordinator保持长连接,不会出现这个问题。
- JDBC驱动与集群版本不兼容:驱动版本和Trino集群版本差异过大时,会话标识逻辑可能不匹配,导致后续请求无法关联到已提交的查询。
- Envoy代理配置缺失会话保持:错误日志显示请求经过Envoy,如果Envoy未配置会话亲和性,会导致同一客户端的请求被分发到不同Coordinator节点。
- 查询会话被提前清理:如果JDBC拉取结果间隔过长,Coordinator已清理超时的查询会话,但这种情况CLI也会受影响,概率较低。
具体修复步骤
1. 给JDBC连接添加会话亲和性参数
修改JDBC连接URL,强制后续请求路由到同一个Coordinator节点:
jdbc:trino://trino.svc.cluster.local:8080/your_catalog/your_schema?sessionAffinity=true
如果使用连接池,需确保连接池不会频繁重建连接,避免路由到其他节点。
2. 对齐JDBC驱动与Trino集群版本
确保驱动版本和集群版本完全一致,比如集群为450版本,就使用对应版本的驱动:
<!-- Maven依赖示例 --> <dependency> <groupId>io.trino</groupId> <artifactId>trino-jdbc</artifactId> <version>450</version> </dependency>
3. 配置Envoy的会话亲和性
如果用Envoy做代理,添加基于Cookie或源IP的会话保持配置,确保同一客户端请求始终路由到同一Coordinator:
cluster: name: trino-coordinator-cluster connect_timeout: 0.25s type: STRICT_DNS lb_policy: ROUND_ROBIN session_affinity: name: COOKIE cookie_session_affinity: name: "trino-session-id" ttl: 86400s
4. 延长Trino查询会话保留时间
修改Coordinator的config.properties配置,延长查询闲置和执行超时时间:
query.max-execution-time=2h query.max-idle-time=30m
修改后重启Coordinator Pod生效。
验证方式
调整配置后重新通过JDBC提交查询,观察是否仍出现404;同时查看Trino Coordinator日志,确认所有请求都路由到了同一个节点。
内容的提问来源于stack exchange,提问作者ritratt
相关产品推荐
相关产品推荐

