本系列前 17 篇从 SQL 与逻辑计划 追到 Iceberg planner 下推,从 Coordinator/Worker 追到 故障排查。读者最后需要一个 不带营销排名 的收束:我的场景该用哪类引擎、全栈还缺哪几块知识。
本文是系列 第 18 篇(末篇):
- 选型决策树:交互式联邦、批 ETL、嵌入式分析、流批一体四条路径。
- 能力对照表:下推深度、并发模型、湖格式成熟度、运维复杂度——不给假 benchmark。
- 数据平台全栈阅读地图:postgresql-kernel → columnar-engine → lakehouse → stream-processing → 本系列 的依赖与闭合点。
环境说明:对照表依据各项目 2026 年官方文档(A 级)与系列前文机制;Trino/Spark 吞吐对比不在此篇出现(本机无 JVM 集群实测)。开放问题(Substrait、Velox)标注 B 级前瞻,不冒充结论。
一、数据平台栈:五段闭合
flowchart LR
PG["postgresql-kernel<br/>行存 OLTP"]
COL["columnar-engine<br/>列存 OLAP"]
LAKE["lakehouse<br/>表格式 + 文件"]
STREAM["stream-processing<br/>实时计算"]
QE["query-engine<br/>本系列"]
PG --> COL
COL --> LAKE
LAKE --> STREAM
LAKE --> QE
STREAM -.->|入湖| LAKE
| 顺序 | 系列 | 核心问题 | 与本系列接口 |
|---|---|---|---|
| 1 | PostgreSQL 内核 | 事务、B-Tree、进程内 CBO | 第 2、4、6 篇 对照 parse/plan/执行 |
| 2 | 列存引擎 | 向量化 scan、MergeTree | 第 7 篇;DuckDB 存储见 columnar/11 |
| 3 | Lakehouse | Parquet/Iceberg、manifest | lakehouse/18 读湖漏斗 ↔︎ 第 15 篇 planner |
| 4 | 流式处理 | Kafka/Flink、入湖 | 第 1 篇 流批边界;第 16 篇 背压对照 |
| 5 | query-engine(本系列) | SQL → MPP 执行、联邦 | 闭合「谁在扫 manifest」 |
闭合点:lakehouse 公式 Lakehouse = 列式文件 + 对象存储 + 表格式 + catalog + 查询引擎 中,前五项由 lakehouse/stream 系列覆盖 文件与表;查询引擎 由本系列覆盖 planning 与 MPP。读完 18 篇,读者应能解释:lakehouse/18 的四层漏斗 在 Trino 哪一步被发起(第 15 篇),以及 join shuffle 与 spill 如何与裁剪无关地拖慢查询(第 11、16、17 篇)。
二、选型决策树(不排名)
flowchart TD
START["分析需求"] --> Q1{"需要多用户远程 SQL 服务?"}
Q1 -->|否| Q2{"数据与并发能否单机?"}
Q2 -->|是| DDB["DuckDB / 嵌入式 DataFusion"]
Q2 -->|否| Q3{"以批 ETL + 湖维护为主?"}
Q1 -->|是| Q3
Q3 -->|是| SPARK["Spark SQL + Iceberg/Delta 维护"]
Q3 -->|否| Q4{"亚秒交互 + 多源联邦?"}
Q4 -->|是| TRINO["Trino / Presto 系"]
Q4 -->|否| Q5{"自有列存集群 + 高 QPS?"}
Q5 -->|是| CH["ClickHouse"]
Q5 -->|否| TRINO
START --> Q6{"无界流 + 状态?"}
Q6 -->|是| FLINK["Flink / RisingWave 等<br/>见 stream-processing"]
2.1 路径说明
| 路径 | 首选引擎 | 依据 |
|---|---|---|
| 交互式联邦 | Trino | 多 connector、低延迟 ad-hoc、resource group(第 10、16 篇) |
| 批 ETL + 湖维护 | Spark SQL | Iceberg/Delta procedure、AQE 批处理(第 13 篇) |
| 嵌入式 / 笔记本 | DuckDB | 无 JVM、读 Parquet/Iceberg(第 14 篇) |
| 自研 Rust 数据面 | DataFusion | 嵌入 TableProvider(第 14 篇) |
| 自有 OLAP 集群 QPS | ClickHouse | MergeTree 主存储(columnar-engine);湖表作外表 |
| OLTP 点查 | PostgreSQL | 非本系列主战场 |
| 流批一体增量 | Flink / RisingWave | stream-processing/18;非交互式 OLAP |
组合常见:Spark/Flink 写湖 + Trino 交互查湖 + DuckDB CI/本地校验;ClickHouse Serving 层 + 湖作冷数据。
三、能力对照表(口径:自托管读路径,2026 文档)
| 引擎 | 交互式联邦 | 湖格式读 | 湖写入/维护 | 并发模型 | 下推/planning | 运维复杂度 |
|---|---|---|---|---|---|---|
| Trino | 强 | Iceberg/Delta/Hive 等 | 有限(如 optimize) | Coordinator 队列 + Worker | 分布式 planning + dynamic filter | 中:JVM 集群 + catalog |
| Spark | 中(启动开销) | 强 | 强(procedure) | YARN/K8s 作业 | Driver planning + AQE | 高:集群 + 作业调度 |
| ClickHouse | 强(自有协议) | 外表/表函数读 Iceberg/Delta | 非主路径 | 原生分布式 | MergeTree 主路径;湖为外部 | 中:CH 集群 |
| DuckDB | 弱(嵌入) | Iceberg/Delta 扩展 | Iceberg 有限写 | 单进程多线程 | 单进程 planning | 低 |
| DataFusion | 库(需自建服务) | crate 依赖 | 通常只读 | 嵌入 | 可插拔规则 | 取决于宿主 |
| PostgreSQL | OLTP | 外表/fdw | 非湖仓主引擎 | 连接级 | B-Tree 索引路径 | 低(已有 DB) |
下推深度:四层漏斗定义见 lakehouse/18;planner 发起见 第 15 篇。同一 Iceberg 表 上 Trino/Spark/DuckDB 共享 manifest stats;差异在 dynamic filter、分布式 split、写入 procedure。
禁止用法:用「Trino 比 Spark 快 N 倍」营销页支撑选型;应用 第 17 篇 的 planning/runtime 分解做 POC。
四、按读者目标的阅读路径
| 目标 | 路径 |
|---|---|
| 数据平台全栈 | PG index → columnar 04 向量化 → lakehouse 01–08 → stream 01 → query-engine 01 → 02 → 04 → 10 → 12 → 15 → 18 |
| 从 lakehouse/18 来 | query-engine 02 → 03 → 05 → 12 → 15 → 17 |
| Trino 运维 | 01 → 10 → 12 → 16 → 17 → 18 |
| Spark 转 Trino | 01 → 05 → 11 → 12 → 13 → 15 |
| 嵌入式分析 | columnar 11 DuckDB → query-engine 01 → 07 → 14 → 18 |
本系列 18 篇内部依赖见 系列 index 第二节 flowchart。
五、开放问题(B 级前瞻)
以下社区方向 尚未形成单一标准答案,选型 POC 时单独评估:
| 方向 | 说明 | 边界 |
|---|---|---|
| Substrait | 跨引擎 logical plan 交换 | 各引擎导入/导出成熟度不一 |
| Velox | C++ 向量化执行库 | 多作为 Spark/Presto 系加速层嵌入 |
| Unified analytics engine | 单引擎 cover 流批交互 | 工程妥协多,见 stream-processing 与 db-frontier |
| Iceberg REST / catalog 中心化 planning | 减轻 Coordinator manifest IO | 依赖 catalog 实现 |
不在此下「某技术将统一一切」的结论。
六、本系列核心结论收束
- 查询引擎 = SQL 前端 + 优化 + 执行 + MPP + Connector 下推(第 1 篇)。
- 读湖快不快 一半在 布局与 stats(lakehouse),一半在 join/shuffle/内存(本系列 4–11、16–17)。
- 嵌入式与分布式 分界在并发与 shuffle,不在「能否读 Parquet」(第 14 篇)。
- lakehouse/18 讲漏斗;第 15 篇讲 planner 发起——两篇合读才完整。
- 生产稳定性 靠 resource group、统计维护、compaction 与 catalog 健康(第 16–17 篇、lakehouse/17–20)。
七、小结
数据平台栈从 行存事务 到 列存扫描、开放表格式、流式入湖,最后到 交互式 SQL 规划与 MPP——本系列补全最后一块。选型按 远程 SQL、批维护、单机嵌入、流状态 分叉,不按虚构 benchmark 排名。继续深入可阅 数据库索引、db-frontier HTAP 与 distributed 理论。
上一篇:经典故障与排查
参考资料
- Trino / Spark / DuckDB / ClickHouse / PostgreSQL 官方文档(2026 年 stable 线,A 级)。
- 本系列 PLAN.md 与 index(系列结构)。
- lakehouse/18、stream-processing/18(栈闭合)。
- Substrait / Velox 社区文档与博客(B 级前瞻)。
同主题继续阅读
把当前热点继续串成多页阅读,而不是停在单篇消费。
【分布式 OLAP 查询引擎】OLAP 查询引擎全景:从单进程到 MPP
从 OLTP/OLAP/HTAP 边界、嵌入式 DuckDB 与分布式 Trino/Spark 分工、批式扫描与交互式查询延迟口径出发,闭合 lakehouse 与 stream-processing 之间的查询层缺口,并给出本系列 18 篇地图。
【分布式 OLAP 查询引擎】Trino · Spark · DuckDB · 优化与 MPP 执行
闭合数据平台栈最后一块:从 SQL 解析与 Calcite 式优化,到 Volcano/向量化执行、Trino Coordinator/Worker 与 shuffle,再到 Iceberg connector 下推与生产排查。承接 lakehouse 第 18 章读湖视角,补全「谁在做 planning」的引擎内核层。
【分布式 OLAP 查询引擎】SQL 解析、分析与逻辑计划
从 Parser/AST、Analyzer 与 Catalog 元数据到 LogicalPlan 算子树;对照 PostgreSQL parse/rewrite/plan 边界,并用 DuckDB 1.5.4 实测 EXPLAIN 与 Trino 476+ 文档中的 logical plan 结构对读。
【分布式 OLAP 查询引擎】DuckDB 与 DataFusion:嵌入式分析对照
从单进程向量化 pipeline 与 morsel-driven 并行出发,对照 DuckDB 1.5.4 与 Apache DataFusion 的 planner/executor 边界;说明何时选嵌入式读湖、何时必须上 Trino MPP;与 columnar-engine DuckDB 存储篇分工,并用本机实测 EXPLAIN 与 Parquet 投影下推数据锚定结论。