Presto
Presto是专为大数据实时查询计算而设计开发的产品,拥有如下特点:
– 多数据源:通过自定义Connector能支持Mysql,Hive,Kafka等多种数据源
– 支持SQL:完全支持ANSI SQL
– 扩展性:支持自定义开发Connector和UDF
– 混合计算:可以根据需要将开源于不同数据源的多个Catalog进行混合join计算
– 高性能:10倍于Hive的查询性能
– 流水线:基于Pipeline涉及,在数据处理过程当中不用等到所有数据都处理完成后再查看结果
基本概念
服务进程
- Coordinator
- 主要作用:接受查询请求、解析查询语句、生成查询执行计划、任务调度、Worker管理
- 部署于服务器的一个单独节点上,是整个集群的Master节点
- 与Worker通信获得最新的状态信息,同时接受Client的查询请求
- 所有信息交互通过StatmentResource类提供的RESTful接口完成
- Worker
- 工作节点,完成数据的处理和Task的执行
- 定时向Coordinator上报心跳
Presto模型
- Connector
连接器,可以理解为Presto访问不同数据源的驱动程序;每个Connector都实现了Presto的标准SPI接口,因此只要自己实现SPI接口,就可以实现适合自己需求的Connector。Presto Connector Manager根据对应Connector的配置文件中connector.name
属性来决定访问数据源时使用的Connector -
Catalog
类似于Mysql中的数据库实例,配置Connector配置文件时的文件名就是对应数据源的Catalog名。 -
Schema
类似于Mysql中的Database,一个Catalog+一个Schema就唯一确定了一系列可查询的表集合。 -
Table
就是传统数据库中表的概念。一份表的全称组合是 Catalog.Schema.Table
查询执行模型
Presto在执行SQL语句时,将其解析成相应的查询,并分配给Worker执行这些Task
– Statement
即输入的SQL语句;Presto支持符合ANSI标准的SQL语句,由字句,表达式和断言组成
– Query
即查询执行,当Presto接受SQL并执行时,会解析SQL并转变成一个查询执行和相关的查询计划。查询由运行在多个Worker上且相互关联的Stage组成的
> Query和Statement的区别
Statement指的是用户输入的SQL文本;Query指的是分布到所有Worker之间执行的实际查询操作,是为了完成SQL所表述的查询而实例化的配置信息,组件,查询计划,优化信息等;由Stage、Task、Driver、Split、Operator、DataSource组成。
- Stage
查询执行阶段,一个Query由多个有层次关系的Stage组成。一个Stage代表查询执行计划的一部分。通常情况下,每个Query都有个Root Stage,用于聚集其他Stage的输出数据并反馈给用户。Stage并不会在集群中实际执行,只是Coordinator对于查询计划进行管理和建模的逻辑概念。Presto中有4种Stage:- Coordinator_Only:用于执行DDL或者DML语句中最终的表结构创建和更改
- Single:没有下游Stage,结果直接输出给Coordinator,用于聚合其他Stage的输出数据,并最终返回给终端用户
- Source:没有上游Stage,从Coordinator获取数据,用于直接连接数据源,获取原始数据。也会根据查询计划的优化相关完成断言下发和条件过滤等
- Fixed:用于接收其子Stage产生的数据并进行分布式聚合和分组运算
- Exchange
交换。Stage间通过Exchange来连接另一个Stage。Presto中有两种Exchange:- Output Buffer:产生数据的Stage通过这个Exchange将数据传送给下游Stage
- Exchange Client:消费数据的Stage通过这个Exchange从上游Stage获取数据
如果当前Stage是Source类型的Stage,那么该Stage是直接通过相应的Connector读取数据的,通过Source Operator与Connector进行交互。
- Task
Stage逻辑上被分为一系列Task,Task是实际运行在集群上的任务。一个Stage被拆分为一系列Task;每个Task被拆分为一或多个Split;这样Stage和Task都可以并行执行。 -
Split
分片。一个分片是一个大数据集中的一个子集。当执行查询时,首先从Coordinator得到一个表的所有Split,然后根据查询执行计划选取合适的Worker执行Task处理Split -
Driver
一个Task包含一或多个Driver,是作用于一个Split的一系列Operator集合。一个Driver用于处理一个Split产生相应输出,输出由Task收集并传递给下游Stage中的Task。 -
Operator
一个Operator代表对一个Split的一种操作,如过滤,转换等。一个Operator依次读取Split中的数据,将Operator所代表的计算和操作应用在此数据上并产生输出。Operator通过最小单位Page分别读取和输出数据。每次只读取、写入一个Page对象 -
Page
Presto中的最小数据单元,包含多个Block对象,每个Block对象是一个字节数组,存储一个字段的若干行。多个Block横切就是一行真实数据。Page最大为1MB,最多16×1024行数据
Presto执行查询的模型关系
整体架构
-
硬件方面
硬件必须满足大内存,万兆网络和高计算性能特点。集群为Master-Slave的拓扑架构。 -
软件方面
- Client通过HTTP发送SQL查询语句给Coordinator
- Coordinator解析查询语句,生成查询执行计划。Coordinator会根据数据本地性生成对应的HttpRemoteTask
- Coordinator分发Task到对应Work,通过HttpClient发送给节点上TaskResource提供的RESTful接口;Worker启动一个SqlTaskExecution对象或者更新对应对象需要处理的Split
- 执行处于上游Source Stage中的Task,这些Task通过Connector从数据源中读取数据
- 处于下游Stage的Task读取上游输出结果,并在内存中进行计算和处理
- Coordinator会不断从Single Stage中的Task处获取结果,并缓存到Buffer中,直到所有计算结束
- Client不停从Coordinator中获取本次查询结果,直到获取了所有结果