这是我参与「第四届青训营 」笔记创作活动的的第10天
Presto基础概念
- Presto整体架构
服务相关
与服务相关的主要有2个节点,一个做调度体系,另一个完成SQL语句的处理
- Coordinator
- 它主要有3个作用,解析SQL语句,生成执行计划,分发执行任务给Worker节点。
- Worker
- 执行Task处理数据,与其他Worker交互传输数据。
数据源相关
- Connector
- Presto是一个多数据源引擎,可以外接多个不同的存储引擎,如HDFS,Cassandra等,Connector就相当于处理这些存储引擎的统一接口,如图中的Hive Connector,每一个Connector都会对应一个真实的数据源。
- Catalog
- 管理元信息与实际数据的映射关系,以Hive为例,哪一个目录对应哪一张表格的哪个分区,就是Catalog的内容。
Query相关
- Query
- 基于SQL parser 后获得的执行计划
- Stage
- 根据需要将Query拆分成多个子计划subplan,每一个subplan就对应一个Stage
- Fragement
- Stage阶段的不同称呼
- Task
- Worker节点上的最小管理单元,一个Stage只能有一个Task,一个Query可以有多个Task
每个Stage又可以通过LocalExchange切分成多个Operator集合,如下:
- Operator
- 最小的物理算子,如图中LimitOperator
- Pipeline
- Operator集合就是一个Pipeline
- Driver
- Pipeline的可执行实体,是最小的执行单元
- Split
- 输入数据描述,与Driver一一对应,也代表不同Stage中传输的数据
数据传输相关
- Exchange
- 表示不同Stage中的数据传输,大多数情况下相当与Shuffle
- Localexchange
- Stage中的rehash操作,常用于提高并行数据的处理能力,就相当于程序启动一个线程的操作,默认数值是16。
可以看到我们将一个Task不断细分,如果我们要衡量某个任务某个Stage的真实并行度的话,可以计算在不同Pipeline下Split(Driver)的数目之和。
核心组价架构介绍
Presto架构图的细节:
对于分布式组件而言,一个分布式系统的关键是:如何有效的调度我们的资源,即这个服务是怎么做到被发现的,以及多个服务之间的一致性协调。
服务发现
实现服务发现主要使用了Discovery Service来完成:
- Discovery Service:
- Worker配置文件中包含Discovery Service地址,每个Worker节点启动后会向Discovery Service注册,将它们的地址保存在Service,Coordiantor再从Discovery Service中获取Worker节点的信息。
通讯机制
Presto中通信使用了2种协议,分别是Http和Thrift,由于Http协议比较繁杂,我们在内部节点之间传递数据有时并不需要那么多的头部信息之类,为了提高数据传输效率就使用了Thrift,它具有更好的数据编码能力,以及数据压缩率。
不同节点之间使用的协议:
- Presto Clinet / JDBC Client与Server:Http
- Coordiantor与Worker:Http / Thrift
- Worker与Worker:Http / Thrift
- 节点的三种状态
- ACTIVE
- INACTIVE
- SHUDOWN
我们来看一下SHUDOWN状态,在Woker节点要关闭它的服务时,不能自己就停止服务,需要设置SHUDOWN状态,Coordiantor发现后就会设置定时时间,让Worker内的Task尽可能的完成,时间结束后就关闭这个节点。
Presto重要机制
多租户任务调度
stage调度
两个策略:
- AllAtOnceExecutionPolicy
- 同时调度,存在延迟,任务可能会空跑,默认是同时调度
- PhasedExecutionPolicy
- 分阶段调度,有一定延迟、节省部分资源。
Task调度
Task是最小的资源管理单位,它的数量主要靠以下内容确定:
- source
- 根据数据meta决定分配多少个节点
- Fixed:
- hash partition count确定,如集群节点数量
- Sink:
- 汇聚结果到一台机器,再进行一次筛选
- Scaled:
- 无分区限制,可拓展,如write数据
- Coordinator_Only:
- 只需要coordinator参与
选择什么样的节点:
- HARD_AFFINITY
- 计算、存储Local模式,保障计算与存储在同一个节点,减少数据传输
- SOFT_AFFINITY
- 基于某些特定算法,如一致性HASH函数,常用于缓存场景,保证相似的Task调度到同一个Worker
- NO_ PREFERENCE
- 随机选取,常用于普通的纯计算TaskWorker
Split调度
处理多个SQL语句时,可能会有资源占用大的SQL语句,在这段时间可能会有耗时较短的SQL语句,我们就会想能不能将它提前执行,Split调度就负责完成这个任务。
它按照固定时间片,轮训Split处理数据,处理1s,再重新选一个Split执行,且Split之间存在优先级,像小SQL语句的Split的优先级就比较高。这样做既能提前处理小SQL语句,又能防止大SQL语句被饿死(一直被提前)。
多数据源联邦管理
将各个数据源进行统一的抽象,最后由Presto Server进行统一的物理执行。