这是我参与「第四届青训营 」笔记创作活动的第 11 天
本篇笔记我们主要论述Presto框架,研究它可以让我们深入理解 SQL Parser 、 常见算子的实现(如SQL中table scan,join,aggregation)、资源管理与调度、查询优化(如向量优化、动态代码生成)等。
Presto简介
Presto是一款Facebook开源的MPP架构的OLAP查询引擎,可针对不同数据源执行大容量数据集的一款分布式SQL执行引擎。
Presto是一种基于内存的并行计算,支持任意的数据源,数据规模是GB~PB级别,而且是一种Massively parallel processing(mpp)(大规模并行处理)模型。数据规模PB级并不是指将PB级数据放入内存中,而是在计算时拿出一部分数据放在内存中,然后再计算、抛出,再拿出。
OLAP简介
OLAP (OnLine Analytical Processing) 对业务数据执行多维分析,并提供复杂计算,趋势分析和复杂数据建模的能力。是许多商务智能(BI)应用程序背后的技术。现如今OLAP已经发展为基于数据库通过SQL对外提供分析能力。
Presto的基础概念
下面简要从 Presto的架构(服务) 和 基本概念 上介绍 Presto。
Presto基础架构
Coordinator节点 (负责调度)负责接受客户端请求、解析SQL语句、生成并优化分布式逻辑执行计划、将计划中的任务调度到Worker节点上,并跟踪Worker节点和任务的执行状态。
Worker节点 负责任务的执行,接受Coordinator节点的调度。
Presto集群包含1个Coordinator节点和多个Worker节点。 Coordionator节点是管理节点,worker节点 是工作节点。在每个 worker节点 上都会存在一个 worker服务 进程,该服务进程主要进行数据的处理以及 task 的执行,worker服务进程每隔一定的时间都会向Coordinator节点 上的服务发送心跳,接受调度。当客户端提交一个查询的时候,Coordinator节点 则会从当前存活的 worker节点列表 中选择出适合的 worker节点 去运行 task,而 worker节点 在执行每个 task 的时候又会进一步对当前 task 读入的每个 split 进行一系列的操作和处理
另外图上并没有标明Presto的另一个服务,那就是 Discovery Service(将coordinator和woker结合到一起的服务)
- Worker节点 启动后向 Discovery Server服务 注册
- Coordinator 从 Discovery Server 获得 Worker节点
所有的worker节点都将自己注册到Discovery Server上,Discovery Server是一个发现服务的service,Discovery Server发现服务之后,coordinator节点便知道在集群中有多少个worker节点能够工作,分配工作到worker节点时便有了依据。
Presto基础概念
Presto中使用到的技术名词主要有以下几种,对于此部分概念我们应熟知,这样实操时才能更加理解每一步的作用。
Presto基础概念-数据源
-
Connector
Presto通过Connector来支持多数据源,一个Connector代表一种数据源,如 Hive Connector 代表了对 Hive数据源的支持。可以认为 Connector 是由 Presto 提供的适配多数据源的统一接口 -
Catalog
针对不同的数据源,Connector 和 Catalog 是一一对应的关系,Catalog 包含了 schema 和 data source 的映射关系
Presto基础概念-Query部分
-
Query
基于 SQL parser 后获得的执行计划 -
Stage
根据是否需要 shuffle 将 Query 拆分成不同的 subplan,每一个 subpla 便是一个 stage -
Fragment
基本等价于 Stage,属于在不同阶段的称呼 -
Task
单个 Worker 节点上的最小资源管理单元: 在一个节点上, 一个 Stage 只有一个 Task, 一个 Query 可能有多个 Task。在Presto架构中,task是“work horse”。因为分布式查询计划被分解为一系列stage,然后被转换为task,这些task随后执行或被进一步split。一个task有输入和输出,就像一个stage可以有一系列的tasks并行执行一样,一个task可以由一系列的drivers并行执行。 -
Pipeline
Stage 按照 LocalExchange 切分为若干 Operator 集合, 每个 Operator 集合定义一个 Pipeline -
Driver
Pipeline 的可执行实体 , Pipeline 和 Driver 的关系可类比 程序和进程 ,是最小的执行单元,通过 火山迭代模型执行每一个 Operator -
Split
Split是较大数据集的一个分片,分布式查询计划的最低级别是stage。因此它是输入数据的描述(数据实体是 Page), 数量上和 Driver 一一对应,不仅代表实际数据源 split ,也代表了不同stage 间传输的数据 -
Operator
最小的物理算子
Presto基础概念-数据传输部分
-
Exchange
表示不同 Stage 间的数据传输,大多数意义下等价于 Shuffle -
LocalExchange
Stage 内的 rehash 操作,常用于提高并行处理数据的能力(Task 在 presto 中只是最小的容器,而不是最小的执行单元)
Presto的低延迟
- 本地化计算
- 流水式计算作业
- 基于内存的并行计算
- 动态编译执行计划
- GC控制
Presto容错
- 如果某个 worker节点 挂了,discovery service 会通知 Coordinator节点
- 对于query是没有容错的,一旦 worker节点 挂了,query 就执行失败了,此时需要重新执行
- Coordinator节点 和 discovery service 的单点故障问题目前还没有解决