Presto 架构原理与优化介绍 | 青训营笔记
这是我参与「第四届青训营 」笔记创作活动的的第9天
一、 Presto 基础概念
-
Coordinator(负责调度):
- 解析SQL语句
- ⽣成执⾏计划
- 分发执⾏任务给Worker节点执⾏
-
Worker 在一个presto集群中,存在一个coordinator节点和多个worker节点,coordinator节点是管理节点,而 worker节点就是工作节点,在每个worker节点上都会存在一个worker服务进程,该服务进程主要进行数 据的处理以及task的执行,worker服务进程每隔一定的时间都会向coordinator上的服务发送心跳,接 受调度。当客户端提交一个查询的时候,coordinator则会从当前存活的worker列表中选择出适合的 worker节点去运行task,而worker在执行每个task的时候又会进一步对当前task读入的每个split进行 一系列的操作和处理
-
Discovery Service(将coordinator和woker结合到一起的服务):
- Worker节点启动后向Discovery Server服务注册
- Coordinator从Discovery Server获得Worker节点
所有的worker都把自己注册到Discovery Server上,Discovery Server是一个发现服务的service, Discovery Server发现服务之后,coordinator便知道在集群中有多少个worker能够工作,分配工作到 worker时便有了根据
-
Connector Presto通过Connector来支持多数据源,一个Connector代表一种数据源,如Hive Connector代表了对Hive数据源的支持。可以认为Connector是由Presto提供的适配多数据源的统一接口
-
Catalog 针对不同的数据源,Connector和Catalog是一一对应的关系,Catalog包含了schema和data source的映射关系。
-
Query 基于SQL parser后获得的执行计划
-
Stage 根据是否需要shuffle将Query拆分成不同的subplan,每一个subplan便是一个stage
-
Fragment 基本等价于Stage,属于在不同阶段的称呼,在本门课程可以认为两者等价
-
Task 单个 Worker 节点上的最小资源管理单元: 在一个节点上, 一个 Stage 只有一个 Task, 一个 Query 可能有多个Task
-
Pipeline Stage 按照 LocalExchange 切分为若干 Operator 集合, 每个 Operator 集合定义一个 Pipeline
二、 核心组件
Presto 架构图
1. 服务发现(Discovery Service)
- Worker配置文件配置Discovery Service地址
- Worker节点启动后会向Discovery Service注册
- Coordinator从Discovery Service获取Worker的地址
2. 通信机制
- Presto Client/JDBC Client与Service间通信
· Http
- Coordinator与Worker间的通信
· Thrift/Http
- Worker与Worker间的通信 · Thrift/Http
三、 重要机制
1. 多租户资源管理
1.1 Case
假设某个用户提交一个sql:
提交方式:Presto-cli(Presto客户端)
提交用户: zhangsan
提交SQL:
select customer——type, avg(cost)
as a from test_table group by
customer_type order by a limit 10;
1.2 Resource Group
- 类似Yarn多级队列的资源管理方式
- 基于CPU、MEMORY、SQL执行数进行资源使用量限制 优点:
- 轻量的Query级别的多级队列资源管理模式 缺点:
- 存在一定的滞后性,只会对Group中正在运行的SQL进行判断
2. 多租户下的任务调度
2.1 物理计划生成
- Antlr4解析生成AST
- 转换成Logical Plan
- 按照是否存在Shuffle(Exchange),切分成不同的Stage(Fragment) 提交SQL:
select customer——type, avg(cost)
as a from test_table group by
customer_type order by a limit 10;
2.2 Presto Stage调度方式
- Stage调度
- Task调度
- Split调度