内容简介 · · · · · ·
本书从OLAP的技术与挑战开始引入主题,先讲基本原理和使用方法,再逐层深入到源码分析上,由浅入深。在内容安排上详细拆解了OLAP分析引擎中的SQL查询解析器、优化器、调度器、执行器这几个核心组件,并将内容扩展到OLAP分析引擎的常见高性能优化方案上。本书分为6篇,共14章节。从OLAP核心概念出发,以Presto为例,从整体执行流程到不同SQL的执行原理,力图把OLAP查询的核心流程以一种系统化的方式来给读者讲清楚。
第一篇(1-2章)总体介绍业界常见的OLAP引擎并分析优劣,讨论OLAP引擎的技术发展趋势,以及如何选型,介绍了Presto相关的背景知识。
第二篇(3-4章)详细的串讲了查询执行的整个过程,带出了查询解析器、优化器、调度器、执行器几个核心模块的工作原理。
第三篇(5-8章)以例讲理,是多种经典SQL的执行原理解析,复杂度逐章递增,包含...
本书从OLAP的技术与挑战开始引入主题,先讲基本原理和使用方法,再逐层深入到源码分析上,由浅入深。在内容安排上详细拆解了OLAP分析引擎中的SQL查询解析器、优化器、调度器、执行器这几个核心组件,并将内容扩展到OLAP分析引擎的常见高性能优化方案上。本书分为6篇,共14章节。从OLAP核心概念出发,以Presto为例,从整体执行流程到不同SQL的执行原理,力图把OLAP查询的核心流程以一种系统化的方式来给读者讲清楚。
第一篇(1-2章)总体介绍业界常见的OLAP引擎并分析优劣,讨论OLAP引擎的技术发展趋势,以及如何选型,介绍了Presto相关的背景知识。
第二篇(3-4章)详细的串讲了查询执行的整个过程,带出了查询解析器、优化器、调度器、执行器几个核心模块的工作原理。
第三篇(5-8章)以例讲理,是多种经典SQL的执行原理解析,复杂度逐章递增,包含了投影变换、过滤、行数限定、排序以及多种聚合场景。
第四篇(9-10章)详解分布式查询执行的数据交换机制,涵盖了查询规划、调度、执行的多个交叉知识点。
第五篇(11-12章)以Presto为例整体介绍了比较流行的OLAP引擎扩展机制——插件体系与连接器。
第六篇(13-14章)是函数的设计原理与开发实战,介绍了函数注册、解析识别、调用等重要流程,最后从标量函数、聚合函数两方面入手,用多个实际的案例来介绍高级API(注解框架)的开发方法以及低级API的底层开发方法。
我们在创作本书时力争做到以下几点:
1)用心创作,而不是堆砌代码凑字数、无脑搬官方文档
2)结合SQL用例讲解技术原理,而不是生硬表达概念或源码
3)知识分层由浅入深,而不使内容过于浅显表面或深入晦涩
4)持续打磨表达能力,使内容逻辑合理清晰、通顺流畅
5)将知识泛化到通用OLAP引擎设计原理使其能够同样适用于Clickhouse、Doris等技术的受众,而不是只关注特定技术的特定细节
如果你正在寻找一本系统性介绍OLAP引擎的好书、如果你希望在使用OLAP引擎的同时深入掌握其核心原理、如果你的目标是从低中阶工程师晋升为资深技术专家;如果你最近在准备数据技术职位的求职面试;我们相信《OLAP引擎底层原理与设计实践》这本书能够有效的帮助到你。
OLAP引擎底层原理与设计实践的创作者
· · · · · ·
作者简介 · · · · · ·
高英举
现于某互联网大厂从事时序数据引擎研发工作,超过12年工作经验,涉及数据平台、数据仓库、OLAP引擎内核。熟悉Hadoop、Presto、Elasticsearch、Spark、Flink等大数据技术,在多个互联网大厂的生产环境中有大规模使用与深入优化经验。此外,也是数据集成流批处理工具Apache SeaTunnel(https://github.com/apache/seatunnel)项目创始人、PMC、主要代码贡献者。
许一腾
现任某互联网大厂数据工程师,主攻数据隐私合规建设。超过7年工作经验,曾在腾讯看点、医疗担任数据研发负责人,期间负责多种大数据平台与能力建设,包括数据质量、联邦查询、数仓建模、DataOps、详细数据血缘、基于意图的权限控制等方向。平时喜欢研究源码,从0到1学习了Redis、Presto(Trino)、Spark等...
高英举
现于某互联网大厂从事时序数据引擎研发工作,超过12年工作经验,涉及数据平台、数据仓库、OLAP引擎内核。熟悉Hadoop、Presto、Elasticsearch、Spark、Flink等大数据技术,在多个互联网大厂的生产环境中有大规模使用与深入优化经验。此外,也是数据集成流批处理工具Apache SeaTunnel(https://github.com/apache/seatunnel)项目创始人、PMC、主要代码贡献者。
许一腾
现任某互联网大厂数据工程师,主攻数据隐私合规建设。超过7年工作经验,曾在腾讯看点、医疗担任数据研发负责人,期间负责多种大数据平台与能力建设,包括数据质量、联邦查询、数仓建模、DataOps、详细数据血缘、基于意图的权限控制等方向。平时喜欢研究源码,从0到1学习了Redis、Presto(Trino)、Spark等多种开源项目,并且热爱分享。
目录 · · · · · ·
推荐序一
推荐序二
推荐序三
推荐序四
前言
第01篇 OLAP基本原理
第01章 OLAP引擎介绍与对比
1.1 OLAP的定义与对比标准
1.1.1 OLAP的定义
1.1.2 OLAP引擎之间的对比标准
1.2 各种OLAP引擎的主要特点
1.2.1 Apache Hive
1.2.2 Apache Spark SQL、Apache Flink SQL
1.2.3 Clickhouse
1.2.4 Elasticsearch
1.2.5 Presto
1.2.6 Apache Impala
1.2.7 Apache Doris
1.2.8 Apache Druid
1.2.9 总结
1.3 再谈对Presto技术发展的理解
1.4 总结、思考、实践
第02章 Presto基本介绍
2.1 Presto概述:特性、原理、架构
2.2 Presto的应用场景与企业案例
2.2.1 Presto的使用场景
2.2.2 Presto的企业案例
2.2.3 Presto不适合哪些场景
2.3 Presto作为OLAP引擎在生产环境中的常见问题与方案
2.3.1 查询协调节点单点问题
2.3.2 查询执行过程没有容错机制
2.3.3 查询执行时报错exceeding memory limits
2.3.4 无法动态增删改数据目录;不支持动态注册UDF
2.3.5 查询执行结果没必要经过集群协调节点给到客户端
2.3.6 不支持低延迟(百毫秒级别)、高并发(5000+QPS)
2.4 Presto与Trino的项目与版本的选择
2.4.1 两个Presto:TrinoDB与PrestoDB选择哪个?
2.4.2 本书为什么用Trino的v350版本来做介绍?
2.4.3 Trino项目源码结构
2.5 编译与运行Presto源码
2.5.1 环境准备
2.5.2 下载源码 & 载入IDEA
2.5.3 编译Presto源码
2.5.4 将Antlr4自动生成的代码标记为generated source
2.5.5 在IDEA中运行3个节点的Presto集群
2.5.6 运行Presto命令行工具
2.5.7 调试Presto源码常见问题
2.6 基于Presto的数据仓库及本书常用SQL介绍
2.6.1 数据仓库介绍
2.6.2 TPC-DS Data Model数据模型介绍
2.6.3 本书用于原理讲解的常用SQL
2.6.4 在哪里执行本节介绍的SQL?
2.7 总结、思考、实践
第02篇 查询执行的整体串讲与核心模块拆解
第03章 分布式查询执行整体流程串讲
3.1 分布式OLAP引擎整体架构及查询执行原理
3.2 分布式查询执行的整体介绍
3.2.1 从分布式架构上看SQL查询的执行流程
3.2.2 从功能模块中看SQL执行流程
3.2.3 原理讲解涉及的案例介绍
3.3 查询的接收、解析、提交
3.3.1 第一步:接收SQL查询请求
3.3.2 第二步:词法与语法分析并生成抽象语法树
3.3.3 第三步:创建QueryExecution并提交给ResourceGroupManager运行
3.4 查询执行计划的生成与优化
3.4.1 第四步:语义分析(Analysis)、生成执行计划
3.4.2 第五步:优化执行计划,生成优化后的执行计划
3.4.3 第六步:将逻辑执行计划树拆分为多个子树
3.5 查询执行计划的调度
3.5.1 第七步:创建SqlStageExecution(创建查询执行阶段)
3.5.2 第八步:查询执行阶段调度-生成HttpRemoteTask并分发到查询执行节点
3.6 查询执行计划的执行
3.6.1 第九步:在多个查询执行节点上执行任务产出查询结果
3.6.2 第十步:分批返回查询计算结果给SQL客户端
3.7 总结、思考、实践
第04章 查询引擎核心模块拆解
4.1 查询引擎核心模块拆解
4.1.1 查询执行计划生成的设计实现
4.1.2 生成初始逻辑计划
4.1.3 使用PlanNode表达逻辑执行计划
4.1.4 总结
4.2 查询执行计划优化的基本原理
4.2.1 查询执行计划优化的目的
4.2.2 查询执行计划优化的基本原理
4.2.3 查询执行计划优化的基础算法
4.3 查询执行计划优化的设计实现
4.3.1 执行计划优化的工作流程
4.3.2 两种优化器实现:非迭代式优化器、迭代式优化器
4.4 总结、思考、实践
第03篇 查询引擎原理的案例讲解
第05章 数据过滤与投影相关查询的执行原理解析
5.1 数据投影、过滤查询的整体介绍
5.2 SQL-01简单拉取数据查询的实现原理
5.2.1 执行计划的生成与优化
5.2.2 分布式调度与执行的设计实现
5.3 SQL-02数据过滤与投影查询的实现原理
5.3.1 执行计划的生成与优化
5.3.2 分布式调度与执行的设计实现
5.4 数据过滤与投影相关查询涉及的查询优化
5.4.1 列裁剪(Column Pruning)
5.4.2 部分计算下推到存储服务
5.4.3 表达式计算的优化
5.5 总结、思考、实践
5.5.1 关于如何设计优秀OLAP引擎的引申思考
5.5.2 阅读与Debug UT是学习优秀开源项目的绝佳方法
5.5.3 思考与实践
第06章 行数限定与排序相关查询的执行原理解析
6.1 行数限定与排序相关查询的整体介绍
6.2 SQL-10 行数限定查询的实现原理
6.2.1 执行计划的生成与优化
6.2.2 分布式调度与执行的设计实现
6.3 SQL-11 排序查询的实现原理
6.3.1 执行计划的生成与优化
6.3.2 分布式调度与执行的设计实现
6.4 SQL-12 排序与行数限定组合查询的实现原理
6.4.1 执行计划的生成与优化
6.4.2 分布式调度与执行的设计实现
6.5 简单SELECT查询相关的查询优化
6.5.1 将LIMIT计算下推到数据源连接器
6.5.2 去除不需要的LIMIT
6.5.3 将ORDER BY + LIMIT优化为TopN计算
6.6 总结、思考、实践
第07章 简单聚合查询的执行原理解析
7.1 聚合查询原理通识性介绍
7.1.1 常见的聚合查询
7.1.2 聚合查询是有状态计算
7.1.3 实现分布式聚合的几种计算模型
7.1.4 Presto对聚合查询的设计与抽象
7.2 SQL-20不分组聚合查询的实现原理
7.2.1 执行计划的生成与优化
7.2.2 分布式调度与执行的设计实现
7.2.3 扩展知识:使用Scatter-Gather模型实现SQL-20
7.2.4 总结
7.3 SQL-21分组聚合查询的实现原理
7.3.1 执行计划的生成与优化
7.3.2 分布式调度与执行的设计实现
7.3.3 扩展知识:使用Scatter-Gather模型实现SQL-21
7.3.4 总结
7.4 聚合函数的设计与实现
7.5 总结、思考、实践
第08章 复杂聚合查询的执行原理解析
8.1 SQL-22去重计数查询的实现原理
8.1.1 执行计划的生成与优化
8.1.2 分布式调度与执行的设计实现
8.1.3 扩展知识:使用Scatter-Gather模型实现SQL-22
8.1.4 总结
8.2 SQL-23多个聚合计算查询的实现原理
8.2.1 执行计划的生成与优化
8.2.2 分布式调度与执行的设计实现
8.2.3 为什么Presto要引入MarkDistinct优化?
8.2.4 扩展知识:使用Scatter-Gather模型实现SQL-23
8.2.5 总结
8.3 SQL-30综合多种计算查询的实现原理
8.3.1 执行计划的生成与优化
8.3.2 分布式调度与执行的设计实现
8.3.3 扩展知识:使用Scatter-Gather模型实现SQL-30
8.3.4 总结
8.4 常见聚合查询优化手段与优化器
8.4.1 将聚合操作拆分为部分聚合与最终聚合
8.4.2 在上下游任务中传播哈希聚合分组列的哈希值
8.4.3 部分聚合计算下推
8.4.4 排序与行数限定计算优化为TopN计算
8.4.5 基于代价评估的方式来决定如何选择执行模型
8.4.6 利用存储的数据分布特性做优化
8.5 总结、思考、实践
第04篇 查询分布式执行的数据交换原理
第09章 数据交换在查询规划、调度、执行中的基本原理
9.1 数据交换机制简介
9.1.1 数据交换是什么?
9.1.2 何时需要做数据交换?
9.1.3 数据交换是拉取模型
9.1.4 任务之间数据交换与任务内部数据交换
9.1.5 数据交换的代价
9.1.6 如何完整的学习掌握数据交换的知识体系?
9.2 查询优化阶段中任务之间数据交换的设计实现
9.2.1 ExchangeNode是什么
9.2.2 利用AddExchanges优化器插入ExchangeNode
9.2.3 AddExchanges优化器决策在哪里插入ExchangeNode的主要考虑因素
9.2.4 AddExchanges优化器的设计实现思路
9.2.5 拆分PlanFragment
9.3 查询调度与执行阶段的整体设计思路
9.3.1 如何在分布式查询集群中唯一确定某个任务在哪里?
9.3.2 对于每个任务哪些任务是它的上游?哪些任务是它的下游?
9.3.3 对于上游任务产出的每行数据,它应该交付给下游哪个任务?
9.3.4 上游任务与下游任务之间数据交换的交互机制是什么?
9.3.5 上下游任务生产与消费的速度不能完全一致怎么办?
9.4 总结、思考、实践
第10章 数据交换在查询调度、执行中的详细设计
10.1 查询调度阶段中任务之间数据交换的设计实现
10.1.1 调度部分整体介绍
10.1.2 StageLinkage建立相邻上下游查询执行阶段间的数据依赖关系
10.1.3 RemoteTask中与任务之间数据交换相关的抽象设计
10.2 查询执行阶段中任务之间数据交换上游的设计实现
10.2.1 整体概述
10.2.2 OutputBuffer的工作流程
10.2.3 四种不同的OutputBuffer具体实现类
10.2.4 两种OutputOperator
10.3 查询执行阶段中任务之间数据交换下游的设计实现
10.3.1 整体概述
10.3.2 两种用于拉取上游任务数据的SourceOperator
10.4 上游任务与下游任务之间数据交换的RPC交互机制
10.4.1 数据交换的RPC通信协议
10.4.2 SerializedPage的序列化格式
10.5 任务内部数据交换基本原理
10.6 利用数据交换的能力实现的特殊功能
10.6.1 利用数据交换功能在查询执行路径实现的反压机制
10.6.2 利用数据交换能力实现部分SQL的LIMIT语义
10.6.3 任务之间数据交换交互中的乱序请求
10.6.4 Presto如何做到分批计算与返回执行结果
10.7 总结、思考、实践
第05篇 连接器插件体系详解与开发实践
第11章 连接器插件体系详解
11.1 插件体系整体介绍
11.1.1 插件概述
11.1.2 插件分类
11.1.3 SPI机制
11.2 插件加载机制
11.2.1 插件初始化流程入口
11.2.2 插件加载
11.2.3 插件整合
11.2.4 类加载原理
11.3 连接器实现原理介绍
11.3.1 连接器概述
11.3.2 连接器插件实例化
11.3.3 元数据模块
11.3.4 数据读取
11.3.5 部分计算下推
11.3.6 连接器在查询执行中的作用总结
11.4 关于连接器的一些深入思考
11.4.1 连接器是对数据读取的高度抽象
11.4.2 站在OLAP引擎设计者视角来理解连接器的设计范式
11.5 总结、思考、实践
第12章 连接器开发实践:以Example-HTTP连接器为例
12.1 Example-Http连接器基本介绍
12.2 插件基础代码
12.2.1 ExamplePlugin
12.2.2 ExampleConfig
12.2.3 依赖注入:ExampleModule
12.2.4 ExampleConnector
12.2.5 ExampleConnectorFactory
12.3 元数据模块
12.3.1 ExampleClient
12.3.2 ExampleTable
12.4 自定义句柄
12.5 划分分片
12.6 读取分片
12.7 实现与连接器交互的HTTP数据源
12.7.1 定义元数据接口
12.7.2 定义数据接口
12.7.3 example-http数据源的代码实现示例
12.7.4 在Presto跑通example-http数据源的查询
12.8 总结、思考、实践
第06篇 函数的执行原理与自定义函数开发实践
第13章 函数的执行原理
13.1 函数体系总览
13.1.1 函数分类
13.1.2 函数的生命周期
13.1.3 函数开发的几种途径
13.1.4 函数本质
13.1.5 入门函数体系知识的学习思路
13.2 函数的基本构成
13.2.1 函数管理
13.2.2 函数元数据
13.2.3 函数签名
13.2.4 泛型变量
13.2.5 字面量变量
13.2.6 自动注入的参数
13.3 函数相关的主要流程
13.3.1 引擎启动时的函数注册
13.3.2 查询执行时的函数解析
13.3.3 查询执行时的函数调用
13.4 总结、思考、实践
13.4.1 总结
13.4.2 知识扩展
13.4.3 思考、实践
第14章 自定义函数开发实践
14.1 标量函数开发实践
14.1.1 标量函数开发方法1-注解框架
14.1.2 标量函数开发方法2-底层开发方法
14.2 聚合函数开发实践
14.2.1 实现聚合函数的核心原理
14.2.2 开发方法介绍
14.2.3 聚合函数开发方法1-注解框架
14.2.4 聚合函数开发方法2-底层开发
14.3 总结、思考、实践
· · · · · · (收起)
丛书信息
· · · · · ·
OLAP引擎底层原理与设计实践的书评 · · · · · · ( 全部 4 条 )

大数据和时序数据处理强烈推荐
> 更多书评 4篇
论坛 · · · · · ·
本书第11章结尾思考题讨论 | 来自Gary改变世界 | 2025-03-01 23:57:31 | |
本书第10章结尾思考题讨论 | 来自Gary改变世界 | 2025-03-01 23:56:58 | |
本书第09章结尾思考题讨论 | 来自Gary改变世界 | 2025-03-01 23:55:45 | |
本书第08章结尾思考题讨论 | 来自Gary改变世界 | 2025-03-01 23:55:21 | |
本书第07章结尾思考题讨论 | 来自Gary改变世界 | 2025-03-01 23:54:40 |
> 浏览更多话题
以下书单推荐 · · · · · · ( 全部 )
- Big Data (Gary改变世界)
谁读这本书? · · · · · ·
二手市场
· · · · · ·
- 在豆瓣转让 有30人想读,手里有一本闲着?
订阅关于OLAP引擎底层原理与设计实践的评论:
feed: rss 2.0
1 有用 空山竹语 2025-03-10 18:15:30 上海
难得一见的 OLAP 引擎深度剖析书籍,作者以 Presto 为解剖样本,在详细讲解其源码的同时,将 OLAP 引擎的方方面面做了细致讲解。读完本书,不仅能深入了解 Presto 的实现,还能对所有 OLAP 引擎的执行原理有深刻的理解,强烈推荐!
1 有用 AsyncGreed 2025-03-14 22:28:21 浙江
说实话并不是第一次读AP相关的书,但是能庖丁解牛一般把查询优化的每个脉络讲的清清楚楚的书还是第一次看到,之前读过不细想,很快就会忘记,但是跟着作者的思考,捋清楚每个点之前的前后关系,我一口气看到了快天亮,隔了几天很多关于查询的细节都还在脑海中清晰可见,我想让我收益的不仅是OLAP&查询引擎设计本身,还有对复杂度的拆解以及对问题的深度思考,让我获益良多
2 有用 独钓寒江雪 2025-02-28 22:46:15 上海
刚看完第一章就感受到了作者深厚的大数据功底和丰富的行业经验。第一章主要描述了主流olap引擎的特点,其实也是olap引擎的发展史。很适合像我这种入行年限较短的同学,例如第一章讲到了hive这种sql on hadoop的架构,实话说我只知道hive这个东西,当我入行的时候,这些已经不流行了,就少了很多学习的机会。作者在第一章把各种olap引擎的特点娓娓道来;从hive到spark/flink,再到... 刚看完第一章就感受到了作者深厚的大数据功底和丰富的行业经验。第一章主要描述了主流olap引擎的特点,其实也是olap引擎的发展史。很适合像我这种入行年限较短的同学,例如第一章讲到了hive这种sql on hadoop的架构,实话说我只知道hive这个东西,当我入行的时候,这些已经不流行了,就少了很多学习的机会。作者在第一章把各种olap引擎的特点娓娓道来;从hive到spark/flink,再到clickhouse/es/druid等,他们都解决了哪些问题,又存在什么问题;此外第一章还对一些定义做了定量,例如olap中什么样的qps才算高并发,其实这些数据是我们技术选型的重要参考标准,期待阅读后续的章节。 (展开)
1 有用 cx 2025-03-18 09:53:38 浙江
最近想了解一下olap查询引擎的实现,正好看到这本书,看了之后收获很大,以presto为例一步步讲解了查询引擎各个模块的实现,尤其是分布式调度、数据交换的部分,讲这方面资料比较少,很难得
1 有用 时间做伴 2025-02-28 14:02:50 上海
很干货的一本书,最开始了解书中内容是从作者的知乎技术博文开始的,这本书对于想深入了解olap存储引擎设计原理的同学来说会很有帮助,除此之外里面还介绍了关于多租户资源调度,分布式设计等内容,是非常值得学习的一本技术类书籍