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

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

文章导航

分类入口
databasedistributed
标签入口
#trino#presto#spark#duckdb#datafusion#calcite#query-optimizer#mpp#shuffle#iceberg#olap#predicate-pushdown

目录

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

读者读完 数据湖与开放表格式(表格式、Parquet、Iceberg 提交)与 流式数据处理(Kafka、Flink、入湖)之后,数据平台栈还差最后一环:交互式 SQL 如何在湖/列存/联邦源上变成物理计划、在 MPP 集群上跑起来lakehouse 第 18 章 从「引擎如何读湖(partition/file/row-group 下推漏斗)」切入;本系列从 SQL 前端 → 逻辑/物理优化 → 执行模型 → Coordinator/Worker/shuffle → Connector 下推发起层 系统拆解。

本系列不写 SQL 语法教程,也不写 BI 选型,写:

系列状态:已完成(2026-07-07)。全 18 篇正文均已发布,可点进阅读。

版本锚定:Trino 476+;Spark 3.5+;DuckDB 1.5.4(本机实测);Iceberg table spec V2 主线。Trino/Spark 机制来自官方文档与源码路径;本机 WSL2 未部署 JVM 查询集群,DuckDB 实验见 reproduce/run_duckdb_experiments.py,Trino 栈见 reproduce/docker-compose.yml

适合谁看

数据平台全栈阅读顺序

阶段 系列 回答的核心问题
1 PostgreSQL 内核 数据在进程里怎么事务、怎么 B-Tree 扫描
2 列存引擎 读优化列存怎么向量化 scan
3 Lakehouse 数据在对象存储上怎么当表用
4 流式处理 实时管道怎么算、怎么 exactly-once 入湖
5 本系列 交互式 SQL 怎么规划、怎么 MPP 执行、怎么下推读湖

推荐阅读路径

路径 篇目 适合
数据平台全栈闭合 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 调优与排查
优化器理论 2 → 3 → 4 → 5 → 6 IR 与 CBO
完整通读 1 → … → 18 系统掌握

一、六个关键问题

  1. 一条 SQL 从文本到 Worker 上的 Task,中间经过哪几层 IR? → 第 1、2、3 篇
  2. CBO 如何估 join cardinality、选 hash/broadcast join?统计错了会怎样? → 第 4、5 篇
  3. Volcano、向量化、morsel-driven 三种执行模型差在哪? → 第 6、7 篇
  4. Coordinator、Worker、shuffle、Exchange 各保证什么? → 第 10、11 篇
  5. Trino / Spark / DuckDB 读 Iceberg 时,下推在 planner 哪一步发起? → 第 12、15 篇(对读 lakehouse/18
  6. 生产慢查询、OOM、倾斜怎么查?引擎怎么选? → 第 16、17、18 篇

二、篇目依赖

flowchart TD
  A["01 OLAP 全景"] --> B["02 SQL 与逻辑计划"]
  B --> C["03 Calcite 与优化框架"]
  C --> D["04 统计与代价模型"]
  D --> E["05 Join 与物理算子选择"]
  A --> F["06 Volcano 模型"]
  F --> G["07 向量化与 morsel"]
  G --> H["08 Scan Filter Project"]
  H --> I["09 Hash Join 与 Agg"]
  A --> J["10 Coordinator Worker"]
  J --> K["11 Shuffle Exchange"]
  E --> L["12 Trino 全路径"]
  H --> L
  J --> L
  L --> M["13 Spark Catalyst"]
  L --> N["14 DuckDB DataFusion"]
  L --> O["15 Iceberg 下推全链路"]
  I --> P["16 内存 Spill 隔离"]
  K --> P
  L --> P
  P --> Q["17 经典故障排查"]
  Q --> R["18 选型与阅读地图"]
  M --> R
  N --> R
  O --> R

跨系列:lakehouse/18 → 15;columnar-engine/04 → 07;stream-processing/01 → 01。

三、目录与每篇价值点

第一部分:查询引擎基础

  1. OLAP 查询引擎全景:从单进程到 MPP
    • OLTP/OLAP/HTAP 边界;嵌入式 vs 分布式;数据平台栈闭合图;全系列 18 篇地图。
  2. SQL 解析、分析与逻辑计划
    • Parser/Analyzer/Catalog;LogicalPlan 节点;DuckDB EXPLAIN 与 Trino logical plan 对照;PG parse/plan 边界。
  3. Calcite 与规则/代价优化框架
    • RelNode、Convention、Rule;Volcano/Cascades 搜索;Trino 自研 planner 与 Calcite 边界。

第二部分:统计与物理优化

  1. 统计信息与代价模型
    • NDV、histogram、Iceberg manifest stats;代价模型 CPU/IO/network;统计过期与全表扫误触发。
  2. Join 重排与物理算子选择
    • Join order;hash/merge/nested loop;broadcast vs partitioned join;DPP 与 runtime filter。

第三部分:执行模型与物理算子

  1. Volcano 迭代器模型
    • Open/Next/Close pull 语义;pipeline breaker;PG ExecutorRun 与 Trino Operator 对照。
  2. 向量化与 morsel-driven 执行
    • 列向量 batch、SelectionVector;DuckDB morsel-driven;Trino Page;链接 columnar-engine/04。
  3. Scan、Filter 与 Project
    • ConnectorSplit/PageSource;column pruning;谓词与 limit 下推边界。
  4. Hash Join 与 Hash Aggregation
    • Build/probe;partial/final agg;revocable memory 与 spill 触发。

第四部分:MPP 架构

  1. Coordinator 与 Worker 架构
    • Query/Stage/Task/Driver;Split 调度与 locality;Spark Driver/Executor 对照。
  2. Shuffle 与 Exchange
    • HASH/BROADCAST/REPLICATE;Local vs Remote exchange;倾斜判读;Spark AQE 边界。

第五部分:引擎主线与对照

  1. Trino 查询路径全拆解
    • SqlQueryExecution 生命周期;Iceberg manifest → Split;Page 流;EXPLAIN ANALYZE 判读。
  2. Spark SQL 与 Catalyst
    • Analyzed/Optimized/Physical;whole-stage codegen;AQE;Iceberg reader 对照。
  3. DuckDB 与 DataFusion
    • 嵌入式分析 vs 分布式;本机 DuckDB 实测;与 columnar-engine DuckDB 篇分工。
  4. Iceberg Connector 下推全链路
    • Planner 视角四层漏斗;与 lakehouse/18 分工;Trino/Spark/DuckDB 能力表。

第六部分:生产与收束

  1. 内存、Spill 与资源隔离
    • Query/user 内存账户;join/agg spill;resource group;对照 stream/18 背压。
  2. 经典故障与排查
    • 全表扫、大 shuffle、OOM、straggler、catalog 超时;排查工具链。
  3. 引擎选型与数据平台阅读地图
    • Trino/Spark/CH/DuckDB/PG 决策树;数据平台全栈延伸阅读;Substrait/Velox 前瞻边界。

四、与相邻系列的分工

话题 本系列 相邻系列
Parquet row group / page 格式 不展开 lakehouse/02
manifest partition/file pruning 漏斗 第 15 篇从 planner 视角 lakehouse/18
MergeTree 向量化存储 不展开 columnar-engine
Flink 流式 SQL / 窗口 不展开 stream-processing
PG 进程内执行器 第 2、6 篇对照引用 postgresql-kernel

参考


返回 数据库索引 · Lakehouse 系列 · 流式处理系列

同主题继续阅读

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

2026-07-07 · database / distributed

【分布式 OLAP 查询引擎】Iceberg 下推全链路:Planner 视角

与 lakehouse/18 分工:那边讲四层读湖漏斗是什么;本篇讲 Trino/Spark/DuckDB 在 SQL 优化链的哪一步把谓词变成 layout constraint、谁调用 Iceberg planning、split 如何携带残余谓词。引用官方文档与 lakehouse/18 本机 PyIceberg 实测,不伪造 Trino 计划输出。

2026-07-07 · database / distributed

【分布式 OLAP 查询引擎】引擎选型与数据平台阅读地图

用决策树收束 Trino/Spark/ClickHouse/DuckDB/DataFusion/PostgreSQL 的适用边界:交互式联邦、批 ETL、嵌入式分析、流批一体各走哪条路径;给出能力对照表(无吞吐排名)与 postgresql→columnar→lakehouse→stream→query-engine 全栈阅读顺序,闭合数据平台栈。


By .