购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

前言

为什么要写这本书

在大数据时代,OLAP引擎作为处理海量数据的关键技术,其复杂性和技术深度要求我们不断学习和探索。然而,市面上关于OLAP引擎的资料大多数都是分散且难以系统化理解的。本书试图通过梳理OLAP引擎的设计哲学、架构原理、查询执行机制以及优化策略,为读者提供一个清晰的学习路径。

20世纪90年代末,OLAP起源于传统数据库,一直未有起色,2006年后经过近5年的发展,产生了一门新的技术——OLAP大数据分析引擎(简称OLAP引擎)。OLAP结合大数据得以蓬勃发展,在大型互联网公司占据了极其重要的地位,诸如Presto、Impala、Druid、Elasticsearch、Kylin、阿里云AnalyticDB等产品层出不穷,这也是它们最辉煌的时代。由Facebook开源的Presto是其中的佼佼者,它是以MPP为架构的OLAP引擎中的中流砥柱。如果你学习过Spark、Flink的源码,会惊喜地发现,其中的多个设计思路和实现都参考了Presto,甚至于2019年在北京召开的Flink Forward大会上介绍Flink OLAP发展方向时,对比的对象都是Presto。无论是在Facebook、Amazon、Uber、Twitter,还是在腾讯、阿里、京东、美团、滴滴,都可以见到Presto,由此可见Presto在大数据领域的影响力。

OLAP引擎底层技术中有很多数据库相关的知识点和优化技术,有些实现甚至是对数据库技术的直接借鉴和模仿。所以,我们以Presto为例来学习数据库知识,了解OLAP引擎底层技术。但是,仅看Presto源码是不够的,还需要上升到理论,再用理论指导实践,这样才能够完全看懂和理解Presto的代码。当然,笔者并不是建议大家在开始阶段就使劲学习理论,这样容易导致大家感觉自己看懂了,实际上还是不懂。

基于以上背景,笔者构思了本书的内容,从OLAP引擎的技术与挑战开题,先讲基本原理和使用方法,再以Presto源码为例由浅入深分析OLAP引擎设计方法。本书详细拆解了OLAP引擎中的SQL解析器、优化器、调度器、执行器这几个核心组件,并将内容扩展到OLAP引擎的高性能优化方案上。笔者希望通过本书,让正在苦苦学习大数据OLAP与SQL却找不到切入点或者方向的你,迅速提升专业能力。

为什么能写这本书

作为在大数据领域深耕超过十年的技术实践者,我们有幸参与了多个OLAP引擎的设计、开发和优化工作。这些宝贵的一线经验,加上对相关技术的深入研究,使我们具备了撰写本书的能力和信心。同时,笔者能够把复杂的技术问题拆解成读者可循序渐进地学习的内容,站在读者的视角来讲解OLAP引擎相关技术。此外笔者还花数年时间翻阅了国内外所有与OLAP引擎相关的技术书籍(不仅是Presto技术相关的书籍)。我们希望能够将所有OLAP领域必备的知识深入浅出地分享给更多的读者,推动这一领域的交流与发展。

什么人要读这本书

本书适合对OLAP引擎感兴趣的技术人员阅读。如果你是数据库开发者、数据架构师、大数据工程师,或者是对分布式计算和SQL引擎感兴趣的学生、研究人员,本书将为你提供宝贵的知识和经验。无论是希望在现有OLAP产品的基础上进行二次开发,还是仅想了解OLAP引擎背后的技术原理,本书都将是你的理想选择。

如何阅读这本书

建议读者在阅读本书之前具备以下条件。

❑ 了解Java编程语言,尤其是Java 8及以上的Lambda表达式特性,了解Guice、Guava等常用库。

❑ 对OLAP概念有基本了解,对大数据领域的全景有基本认知。

❑ 会写常见的SQL,对基本语法(如投影、过滤、关联、聚合、开窗等语法)有实际编写经验。

❑ 熟悉Presto的使用,对官方文档的内容有一定了解,或者阅读过《Trino权威指南》。

❑ 有在生产环境中使用Presto或其他OLAP引擎的经验。

本书分为6篇,共14章。从OLAP核心概念出发,以Presto为例,从整体执行流程到不同SQL的执行原理都有介绍,力图把OLAP查询的核心流程以一种系统化的方式给读者讲清楚。

第一篇背景知识(第1章和第2章):

❑ 第1章从OLAP的定义出发,深入对比了多个流行的OLAP引擎,包括但不限于Hive、SparkSQL、FlinkSQL、ClickHouse等,分析它们在各个方面的优劣,并讨论OLAP引擎的技术发展趋势及如何选型。

❑ 第2章介绍了Presto相关的背景知识,对比Trino和Presto的区别,介绍如何编译、运行源码,并给出了后续贯穿全书的SQL代码。

第二篇核心原理(第3章和第4章):

❑ 第3章非常详细地串讲了SQL执行流程,从查询提交到语法分析、语义分析,再到执行计划生成、优化、拆分、调度和执行,目的是帮读者建立一个整体的认知框架,方便对后续内容的学习。

❑ 第4章详细介绍了执行计划的生成和优化,包括前置的语法分析、语义分析流程,以及执行计划的生成、优化原理。

第三篇经典SQL(第5~8章): 对多种经典SQL的执行进行原理级解析。每一章对应了一类SQL,复杂度从前到后递增,包含投影、过滤、行数限定、排序以及多种聚合场景。对每一类SQL的解读都包括逻辑执行计划、优化器、物理计划(查询执行阶段划分)、调度与执行几个部分。

第四篇数据交换机制(第9章和第10章):

❑ 第9章从设计的角度出发,对整个交换机制进行详细介绍,并且从优化器的角度分析数据交换的设计方法,以及调度、执行过程的设计思路。

❑ 第10章主要介绍OLAP引擎的具体实现原理,包含调度阶段的任务依赖收集、上游数据输出节点的工作原理、下游拉取数据的RPC机制与流程,以及衍生的反压、LIMIT语义、乱序等问题。

第五篇插件体系与连接器(第11章和第12章):

❑ 第11章介绍了插件体系及其背后的SPI机制,还有插件加载流程和底层的类加载原理。连接器是底层数据源的抽象建模,本章重点分析连接器的构成、元数据模块、数据读取模块以及它在优化器中的作用。

❑ 第12章介绍了一个官方提供的实例连接器——Example-HTTP,它比较简单,但是可以帮助读者快速巩固连接器相关的知识。

第六篇函数原理与开发(第13章和第14章):

❑ 第13章首先从原理出发,分析了函数的构成,如泛型参数、字面量变量、自动注入参数等。然后介绍了函数注册流程、语义分析中的函数解析、函数调用等。

❑ 第14章从标量函数、聚合函数两方面入手,用多个实际案例来介绍高级API(注解框架)及低级API的底层开发方法。

如果大家希望深度掌握本书的内容,并做到对大数据分布式SQL计算引擎一通百通,笔者强烈建议大家做到以下几点。

多实践: 搭建一套Presto测试集群。

边看源码边调试: 在Java编译器中把Presto源码跑起来,并结合本书的内容调试源码。

多总结: 尝试把本书的知识点画成脑图,形成自己的知识体系,并泛化到整个OLAP领域。

根据实际业务需求改写源码。

通过单元测试代码理解每个类: 当你理解不了某个类或方法是做什么的,或不知如何使用时,可看一看与它对应的单元测试代码,里面有围绕它的使用方式展开的相对简单且不需要理解全局的代码。

阅读SIGMOD、VLDB、ICDE英文文献: SIGMOD、VLDB及ICDE是数据库方向的三大顶级会议。这些会议上发布的论文,能够引导我们更好地理解源码背后的理论以及最新发展趋势。虽然SIGMOD、VLDB及ICDE是数据库领域的顶级会议,但是因为数据库与OLAP没有绝对的分界线,所以数据库相关的很多技术与OLAP是重叠的。

本书以Presto为例进行讲解。Presto的代码写得非常精美,其中部分代码甚至完全不用修改就可以拿到项目中使用。Presto的部分代码抽象层级比较多,函数调用栈比较深,或者处理逻辑复杂,大家容易看着看着就懵了。对于这类代码,没必要希望一次就看懂。笔者建议至少反复看10次,先从大面着眼,再从细节着眼。

勘误支持

如果大家在阅读过程中发现有内容方面的错漏,欢迎进入腾讯问卷填写详细信息,链接为https://wj.qq.com/s2/14366431/e06c/。

大家可搜索并关注微信公众号“大道至简bigdata”,并回复“获取高英举联系方式”或“获取许一腾联系方式”与本书作者建立联系。添加本书作者微信后还会被拉进大数据技术交流群,大家一起讨论OLAP技术。

高英举 /9Ph+mwnSMHBJwcBx5GXd1Ad2Zu4HNmKLAuhYZL6qolO8Y07LFm4YbapDTBkyUja

点击中间区域
呼出菜单
上一章
目录
下一章
×