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

分布式 OLAP 查询引擎 — 系列规划

目录

分布式 OLAP 查询引擎 — 系列规划

本文是写作规划,不是可发布正文。拆解对象分两层:查询优化与执行框架(Calcite / 规则与代价模型)与分布式 OLAP 引擎(Trino 主线,Spark SQL / DuckDB / DataFusion 对照)。不写 SQL 语法教程,不写 BI 工具选型,不写云托管 Presto/EMR Serverless 内部调度与定价。

关联文档:index.md(读者入口)。本文件聚焦逐章大纲、来源台账、实验台账与写作顺序。

续作关系:闭合数据平台栈最后一块——lakehouse 第 18 章 从「引擎如何读湖(下推链路)」切入;本系列从「SQL 如何变成物理计划并在 MPP 上跑起来」切入,第 15 篇回调 lakehouse/18,从 planning 层重述 partition/file/row-group pruning。


一、为什么写这个系列

1.1 数据平台栈的缺口

已有内容 视角 落点
db/postgresql-kernel/ (26) 行存 OLTP 进程内 B-Tree + CBO + 执行器
db/mysql-innodb/ (20) 行存 OLTP InnoDB + handler/optimizer 边界
db/columnar-engine/ (16) 读优化列存 MergeTree 向量化、morsel-driven
db/lakehouse/ (21) 湖仓表格式 Parquet/Iceberg;第 18 章仅 1 篇引擎读湖
stream-processing/ (18) 实时计算 Kafka/Flink;不写交互式 OLAP
db/lsm-tree/ (5) 写优化 DIY 未落到分布式查询
distributed/ (69) 分布式理论 未落到 Trino/Spark 工程

结论:lakehouse 规划公式 Lakehouse = 列式文件 + 对象存储 + 表格式 + catalog + 查询引擎 中,前五项已有系统拆解;查询引擎仍缺独立系列。读者建完湖、接上 Flink 入湖之后,仍会卡在「Trino 为什么全表扫、CBO 估错 cardinality 后 join 顺序怎么崩、shuffle 倾斜从哪一层看」——lakehouse/18 讲下推漏斗,不讲引擎内部的 IR、优化与 MPP 执行。

1.2 为什么选 Trino(主)+ Spark / DuckDB / DataFusion(对照)

维度 Trino Spark SQL DuckDB DataFusion
角色 交互式分布式 OLAP 批/流统一 + 湖仓默认引擎之一 嵌入式分析 Rust 向量化引擎框架
规范/源码 trino 开源、Connector SPI 清晰 Catalyst + Tungsten 文档与源码 官方 Internals Apache 项目、Arrow 原生
与 lakehouse Iceberg connector 成熟 Iceberg/Delta 一等公民 PyIceberg + 本机已有实测 Iceberg rust 生态
系列篇幅 主线 4 篇(10–12, 15) 对照 1 篇(13) 对照 1 篇(14,含 DataFusion) 并入第 14 篇

选 Trino 作主线:引擎中立读湖的事实默认之一、Coordinator/Worker 边界清晰、EXPLAIN ANALYZE 可观测;Spark 代表 JVM 批处理栈与 AQE;DuckDB/DataFusion 代表嵌入式与 Rust 向量化路径,与 columnar-engine DuckDB 篇 对读但不重复 MergeTree 存储层。

1.3 系列定位

分布式 OLAP 查询引擎 = SQL 前端 + 逻辑/物理优化 + 执行模型 + MPP 调度 + Connector 下推

不写:

写:


二、核心问题与目标读者

2.1 六个关键问题

  1. 一条 SQL 从文本到机器上跑的 Task,中间经过哪几层 IR?各自输入输出是什么? → 第 1、2、3 篇:AST → Analyzed → Logical → Optimized → Physical → Distributed plan。

  2. CBO 在 join 顺序、join 算法、分区裁剪上怎么做决策?统计错了会怎样? → 第 4、5 篇:NDV、histogram、join reorder、DPP。

  3. Volcano、向量化批处理、morsel-driven 三种执行模型差在哪? → 第 6、7 篇;与 columnar-engine/04 对照。

  4. MPP 架构里 coordinator、worker、shuffle、广播各保证什么? → 第 10、11 篇:Split 调度、Exchange 实现、stage 边界。

  5. Trino / Spark / DuckDB 读 Iceberg 表时,下推在哪一层完成? → 第 15 篇;与 lakehouse/18 对读,从引擎 planning 视角重述。

  6. 生产环境查询慢、OOM、shuffle 倾斜怎么诊断?引擎怎么选? → 第 16、17、18 篇:内存账户、spill、runtime filter、选型决策树。

2.2 目标读者


三、篇目结构(全 18 篇)

第一部分:查询引擎基础(第 1–3 篇)

第 1 篇:OLAP 查询引擎全景

第 2 篇:SQL 解析、分析与逻辑计划

第 3 篇:Calcite 与规则/代价优化框架

第二部分:统计与物理优化(第 4–5 篇)

第 4 篇:统计信息与代价模型

第 5 篇:Join 重排与物理算子选择

第三部分:执行模型与物理算子(第 6–9 篇)

第 6 篇:Volcano 迭代器模型

第 7 篇:向量化与 morsel-driven 执行

第 8 篇:Scan、Filter 与 Project

第 9 篇:Hash Join 与 Hash Aggregation

第四部分:MPP 架构(第 10–11 篇)

第 10 篇:Coordinator 与 Worker 架构

第 11 篇:Shuffle 与 Exchange

第五部分:引擎主线与对照(第 12–15 篇)

第 12 篇:Trino 查询路径全拆解(主线)

第 13 篇:Spark SQL 与 Catalyst(对照)

第 14 篇:DuckDB 与 DataFusion(嵌入式对照)

第 15 篇:Iceberg Connector 下推全链路(与 lakehouse/18 对读)

第六部分:生产与收束(第 16–18 篇)

第 16 篇:内存、Spill 与资源隔离

第 17 篇:经典故障与排查

第 18 篇:引擎选型与数据平台阅读地图


四、依赖关系

1 → 2 → 3
3 → 4 → 5
1 → 6 → 7 → 8 → 9
1 → 10 → 11
5,8,10 → 12
12 → 13 → 14 → 15
9,11,12 → 16 → 17 → 18

跨系列:

db/lakehouse/18  ──→ 15(下推对读)
db/lakehouse/08  ──→ 12, 15(manifest 语义)
db/columnar-engine/04 ──→ 7(向量化)
db/postgresql-kernel/10-12 ──→ 2, 4(优化器对照)
stream-processing/01,18 ──→ 1, 16(流批边界)
distributed/          ──→ 10, 11(shuffle 与容错直觉)

五、阅读路径

路径 篇目 适合
数据平台全栈 1→2→4→10→12→15→18 从湖仓到查询层闭合
从 lakehouse/18 来 2→3→5→12→15 搞清 planner 与下推发起层
从 columnar-engine 来 1→6→7→14 执行模型与嵌入式对照
Trino 运维 1→10→12→16→17 集群调优与排查
Spark 读者转 Trino 1→5→11→12→13→15 对照 Catalyst/AQE
优化器理论 2→3→4→5→6 IR 与 CBO
完整通读 1→…→18 系统掌握

六、来源台账

A 级

B 级

禁止


七、实验台账

环境 | Docker Compose:Trino(coordinator + worker)+ MinIO + Iceberg REST catalog(复用/扩展 post/db/lakehouse/reproduce/);可选 Spark local[*] + Iceberg runtime;本机 DuckDB(与 lakehouse/18 同口径:Python 3.14 + DuckDB 1.5.x)。逐篇交代 CPU、内存、OS、组件版本。 |
实验 状态
2 Trino vs DuckDB EXPLAIN logical 结构对比 DuckDB 已跑;Trino 待读者 Docker
4 有/无 ANALYZE 的 estimated rows 对比 Trino 待读者 Docker
5 broadcast vs shuffle join EXPLAIN ANALYZE timing DuckDB join 中位 0.0028s 已跑
7 DuckDB 向量化查询 EXPLAIN ANALYZE threads/timing 已跑
9 大 join 触发 spill 的配置与 EXPLAIN ANALYZE 片段 文档+配置说明
11 skewed key join 各 task input rows 分布 Trino 待读者 Docker
12 Trino 读 Iceberg 分区表 scanned vs total rows Trino 待读者 Docker
13 Spark vs Trino 同表 explain 计划对照 文档引用
14 DuckDB vs Trino scanned bytes 对照 DuckDB 已跑
15 四层谓词各裁一层,记录 plan 中 layout constraint 复用 lakehouse/18 PyIceberg

复现脚本目录:reproduce/docker-compose.yml 扩展 lakehouse 栈、tpch/ 小数据集生成、run_explain.sh)。

每个 benchmark:CPU、内存、OS、组件版本、数据规模、采样轮次(≥3,取中位数);Trino/Spark 未在本机跑过的实验按 lakehouse/18 惯例写清限制,给出可复现步骤但不伪造输出。


八、系列联动

系列 联动
db/lakehouse/ 18 下推链路 ↔︎ 本系列 12/15;08 manifest ↔︎ split 来源
db/columnar-engine/ 04 向量化 ↔︎ 07;DuckDB 11–13 ↔︎ 14
db/postgresql-kernel/ 10–12 优化器/执行器 ↔︎ 02/04/06
stream-processing/ 01 流批边界 ↔︎ 01;18 背压 ↔︎ 16
db/lsm-tree/ 不重复;RocksDB 系列若开写则 16 内存一节交叉引用
db-frontier/ 12 HTAP、23 增量视图 ↔︎ 18 前瞻一句

九、边界

不承诺

承诺


十、写作顺序

  1. index.md(与 PLAN 同步)
  2. 第 1 篇(全景,不依赖 Docker)
  3. 搭建 reproduce/docker-compose.yml(Trino + 复用 lakehouse MinIO/Iceberg)
  4. 第 2、3 篇(前端与 Calcite 框架)
  5. 第 10、12 篇(Trino 架构与全路径,确立主线)
  6. 第 4、5 篇(统计与 join 规划,依赖 Trino 环境)
  7. 第 6、7、8、9 篇(执行模型与算子)
  8. 第 11 篇(shuffle)
  9. 第 15 篇(Iceberg 下推,回调 lakehouse/18)
  10. 第 13、14 篇(Spark / DuckDB 对照)
  11. 第 16、17、18 篇(生产与收束)
  12. 更新 post/db/index.mdpost/series/index.md

十一、已确认决策(2026-07-05)

  1. 系列规模18 篇(与 stream-processing 对齐;比 lakehouse 精简)。
  2. 版本锚定:Trino 476+(或写作时 latest stable);Spark 3.5+;DuckDB 1.5.x;Iceberg 1.x table spec V2 主线。
  3. 引擎主线:Trino 分布式路径;Spark/DuckDB 各 1 篇对照 + 18 篇选型表。
  4. lakehouse/18 边界:18 章保留「读湖漏斗」独立可读;本系列 15 从 planner 视角深化,不迁移 18 章正文。
  5. 实验栈:优先扩展 lakehouse reproduce/,不另起一套 MinIO 数据。

十二、待确认问题

  1. 系列目录:post/db/query-engine/(已定)vs 顶层 post/query-engine/?——建议 post/db/query-engine/,与 lakehouse/columnar 并列。
  2. Trino 是否固定 single-coordinator + 2 worker,还是 single-node 开发模式足够?
  3. TPCH 数据规模:sf0.01 够 explain 实验,sf1 用于 timing——是否统一 sf0.1?
  4. Spark 篇深度:仅 local[*] + Iceberg,还是 Docker spark-submit cluster?

规划版本:v1,2026-07-05
目录:post/db/query-engine/

同主题继续阅读

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

2026-07-07 · database / distributed

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

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


By .