presto 设计与实现
0 人感兴趣 · 13 次引用
- 最新
- 推荐

Presto 设计与实现(十四):SQL 查询过程总结
对于 Presto SQL 语句执行过程,之前的几篇文章已经介绍过 Presto JDBC、基于 ANTLR 4 的词法分析、语法分析、抽象语法树生成和 SQL 查询状态机,今天整体回顾下 SQL 语句完整的执行过程,做个全面的总结。

Presto 设计与实现(十三):查询状态机
为了对 SQL 查询的关键步骤进行标记,Presto 定义了 SQL 查询状态,使用枚举 QueryState 表示,同时使用类 QueryStateMachine 管理 SQL 查询当前状态、SQL 消耗资源和查询状态间合法的切换,每个 SQL 查询只有一个 QueryStateMachine 实例。

Presto 设计与实现(十二):SQL 逻辑计划
逻辑计划:通过对抽象语法树的遍历,将语法树上的 Node 节点转化成 1 个或多个有前后依赖关系的计划,节点遍历完毕即生成一个完整的计划链表,这就是逻辑计划。逻辑计划让 SQL 查询离数据库、表、列和数据更近了一步。

Presto 设计与实现(十一):抽象语法树 AST
ANTLR是一款强大的语法分析器生成工具,可用于读取、处理、执行和翻译结构化的文本或二进制文件。

Presto 设计与实现(十):SQL 语法分析
SQL 语句经过词法分析解析后,会转化成 Token 序列作为语法分析器的输入,语法分析器加载所有的语法规则,根据内部定义的解析策略对 Token 序列进行解析。

Presto 设计与实现(九):SQL 词法分析
一条 SQL 语句在实际执行前,会经过一系列处理,其中开始阶段的词法分析、语法分析和生成 AST 的过程是 SQL 查询的前提条件。

Presto 设计与实现(八):Presto JDBC
JDBC:Java Database Connectivity 是 Java 访问数据库的接口规范,访问数据库需要选择对应的 JDBC 实现。MySQL、Oracle 和 Postgresql 都有对应的 JDBC 的实现,Presto 也是如此,Presto 基于 HTTP 协议实现了 JDBC 规范。

Presto 设计与实现(七):Event
编码实现时尽量减少前后依赖,让代码变得简单,易于维护。这里推荐使用观察者模式来解耦,每个分发逻辑只监听关心的事件。当然我们不是从 0 开始,可以从 Airlift Event 开始。

Presto 设计与实现(六):JMX
JMX:Java Management Extensions 是 Java 的一个开发和通信的标准,用于管理监控应用程序状态。

Presto 设计与实现(五):自动配置
Presto 基于 Airlift 构建的分布式 SQL 查询引擎,在 Presto 中 Airlift 起着举足轻重的作用,如果 Presto 是座大厦,那么 Airlift 就是大厦的地基。

Presto 设计与实现(四):动态代码生成 ByteBuddy
动态代码生成就是运行时通过编码的方式定义类的限定名、属性和方法等,并将其转化为可以被 ClassLoader 直接加载的 Java 字节码。

Presto 设计与实现(三):依赖注入框架 Guice
在上篇文章中已经介绍,Presto 依赖了众多的开源项目,下面让我们按照开源项目在 Presto 实现过程中的重要程度逐一分析,如果你对其中某些开源项目已经非常熟悉,你可以略过相关章节。

Presto 设计与实现(二):一切从 0 开始?
从集群启动的角度看,每个节点首先加载本地配置标识自己的身份信息,向 coordinator 发送 http 请求在 header 中附带标识信息,经过一定时间 coordinator 会收集到所有节点发送的标识信息,进行汇总后,同步一份给所有节点。