土法炼钢兴趣小组的算法知识备份

【分布式 OLAP 查询引擎】经典故障与排查

文章导航

分类入口
databasedistributed
标签入口
#trino#troubleshooting#explain-analyze#shuffle-skew#oom#full-table-scan#metastore#query-optimizer

目录

第 16 篇 讲完内存账户与 spill;第 15 篇 讲完 planner 如何把谓词交给 Iceberg。上线后 BI 用户最常提的三句话是:「为什么全表扫?」「为什么就这一个 task 慢?」「为什么 Coordinator 又 OOM 了?」——三类问题分别对应 planning 裁剪失败runtime 倾斜内存治理,排查入口不同。

本文是系列 第 17 篇,收束 五类经典故障:每类给出 触发条件 → 观测信号 → 止血 → 长期修复,并指向系列前文的机制依据。

环境说明:本机 无 Trino/Spark 集群。工具字段与配置项按 Trino 476+、Spark 3.5+ 官方文档核对;不粘贴未执行的 Web UI 截图或伪造 task 耗时。DuckDB 单机排查可复用 EXPLAIN ANALYZE第 14 篇)。


一、排查总览:先分 Planning 还是 Runtime

flowchart TD
  SLOW["查询慢 / 失败"] --> Q1{"结果是否正确?"}
  Q1 -->|错误| CORR["SQL 语义 / 连接器 bug"]
  Q1 -->|正确| Q2{"Scan 输入是否远大于预期?"}
  Q2 -->|是| PLAN["Planning:统计 / 下推 / 谓词"]
  Q2 -->|否| Q3{"Stage 内 task 耗时是否极不均匀?"}
  Q3 -->|是| SKEW["Runtime:倾斜 / straggler"]
  Q3 -->|否| RES["资源:内存 / spill / 队列"]
阶段 典型工具 本篇章节
Planning EXPLAINEXPLAIN ANALYZE layout/input rows
Shuffle Stage 概览、task raw input rows
Memory Query info、spilled、kill reason
Straggler Task timeline、split 数
Catalog Coordinator log、REST/HMS 超时

二、全表扫:统计、分区谓词、Connector 未下推

2.1 触发条件

2.2 观测信号

引擎 看什么
Trino Scan input rows / input size vs 表规模;layout partition constraint 是否为空
Spark PartitionFilters / PushedFilters 为空
DuckDB Total Files Read 等于表文件总数
通用 PyIceberg plan_files() 文件数(lakehouse/18 方法)

2.3 止血与修复

  1. SQL:改写为裸列 op 常量;时间戳统一 UTC(lakehouse/18 附录 L)。
  2. 策略:Trino iceberg.query-partition-filter-required 对大表强制分区过滤(文档 Iceberg connector)。
  3. 数据:sort/z-order compaction 改善 file pruning(lakehouse/17)。
  4. 统计ANALYZE / Iceberg Puffin NDV(改善 join 计划,不替代 manifest 裁剪)。

三、大 Shuffle 与数据倾斜

3.1 触发条件

3.2 观测信号

3.3 止血与修复

  1. SQL:过滤后再 join;避免 SELECT * 大宽表 shuffle。
  2. Spark AQEspark.sql.adaptive.skewJoin.enabled(文档 3.5+;版本边界以官方为准)。
  3. Trino:无 AQE 同等物时靠 统计刷新 + 手动 hint/重写(如 pre-agg、map join 语义改写);倾斜 key 可 salted join(工程手段,需验证语义)。
  4. 长期:键分布治理、分桶表设计(lakehouse 分区与 bucket spec)。

四、OOM 与 Spill 失败

4.1 触发条件

4.2 观测信号

4.3 止血与修复

  1. 立即:kill 查询;临时调低并发 resource group。
  2. SQL/plan:改 partitioned join、减小 build 侧、加谓词减输入。
  3. 配置:合理 query.max-memory;保证 spill 路径 SSD 与空间。
  4. Coordinator:大 catalog 表增加 manifest 缓存/rewritelakehouse/18 附录 P)。

五、Straggler Task

5.1 触发条件

5.2 观测信号

5.3 止血与修复

  1. Compaction 均衡文件大小。
  2. 提高并行度调整 split 目标大小(connector 配置)。
  3. 节点异构:慢节点摘流或统一硬件;检查 spill 盘。

六、Metastore / Catalog 超时

6.1 触发条件

6.2 观测信号

6.3 止血与修复

  1. 缓存:Trino metastore cache 配置;Iceberg REST 侧 caching(文档版本相关)。
  2. 维护expire_snapshotsrewrite_manifests(Spark/Trino procedure)。
  3. 架构:分离 heavy ETL cataloginteractive catalog;只读副本。

七、工具链速查

目标 Trino Spark DuckDB
计划形状 EXPLAIN / VERBOSE explain() EXPLAIN
运行时 EXPLAIN ANALYZE SQL UI stages EXPLAIN ANALYZE
裁剪 scan input rows、dynamicFilters PushedFilters Total Files Read
倾斜 task raw input stage skew 单进程无 shuffle
队列 resource group UI pool

Event listener / JMX(Trino docs, Monitoring)接 Prometheus 时,优先告警:planning 时长、p95 query memory、spill 率、failed query 原因分类——比单纯 QPS 更能预告故障。


八、小结

下一篇 第 18 篇 把 Trino/Spark/ClickHouse/DuckDB/PG 放进 选型决策树,并闭合 数据平台全栈阅读地图


上一篇内存、Spill 与资源隔离

下一篇引擎选型与阅读地图

返回 系列目录


参考资料

  1. Trino Documentation 476+, Troubleshooting / SQL explain / Monitoring / Iceberg connector(A 级)。
  2. Apache Spark 3.5+ Documentation, SQL tuning / Adaptive Query Execution(A 级)。
  3. lakehouse/18 自检清单(A 级实测方法)。
  4. 公开事故复盘(Coordinator OOM、metastore 雪崩)——引用时标注来源与日期(B 级)。

同主题继续阅读

把当前热点继续串成多页阅读,而不是停在单篇消费。

2026-07-07 · database / distributed

【分布式 OLAP 查询引擎】Trino · Spark · DuckDB · 优化与 MPP 执行

闭合数据平台栈最后一块:从 SQL 解析与 Calcite 式优化,到 Volcano/向量化执行、Trino Coordinator/Worker 与 shuffle,再到 Iceberg connector 下推与生产排查。承接 lakehouse 第 18 章读湖视角,补全「谁在做 planning」的引擎内核层。


By .