presto源码学习1——Presto概述

presto是基于Java语言开发的一个用来即席查询大数据的查询引擎,是facebook公司的一个开源产品

相关文档

  • git地址:https://gitee.com/mirrors/presto.git
  • 官方文档

presto的特点

特点 说明
多数据源 presto目前支持包括mysql、hive等多种常用存储
扩展性 presto支持开发者自定义开发可插拔式的数据源插件
混合计算 presto支持同一个集群接入多个同一种存储组件,比如一个presto集群可以接入两个以上的hive集群,并且支持对这两个不同的hive集群的数据进行join查询和计算
高性能 presto是完全基于内存的并行计算,查询速度是hive的十倍之上

presto中的角色

在这里插入图片描述

如图所示,presto一次查询中主要涉及下面三种角色:

  • client:发起数据查询请求方,方式有:pre-cli、jdbc等
  • Coordinator:presto集群中的管理节点,主要负责接收数据查询的请求、解析查询语句、生成查询计划、任务调度和集群节点管理等
  • worker:是presto集群重的工作节点,主要负责执行Coordinator节点分发的数据计算操作

其中,worker节点会定期向Coordinator节点发送心跳,而Coordinator节点会维护存活的worker节点列表,并从中选择合适的worker节点用来执行具体的计算任务

presto的相关概念

Connector

可以理解为presto用来访问不同数据源的驱动或是插件,目前支持的connector有hive、mysql、kafka、kudu等,这些connector都实现了presto定义的spi接口,如果需要自定义特殊的数据源,也可以通过实现这个spi接口来开发特定的插件

Catalog

presto的catalog相当于我们经常说的mysql实例,可以在$PRESTO_HOME/etc/catalog/下通过新增.properties文件来习总能catalog,其中文件名就是catalog名,我们可以通过定义不同的catalog来接入不同的数据存储,比如hive、mysql等,文件中的具体配置信息可以直接参考presto提供的杨例配置,比较清晰

Schema

schema就相当于我们平常用的数据库了,当presto访问hive或者mysql数据库时,schema就会转换为目标数据库中相同的概念

Table

presto中的数据表定义与其他数据库中的表定义是一样的

presto的查询执行模型

Statement

就是客户端向presto集群提交的SQL查询语句

Query

presto会将接收到的Statement语句进行解析,然后转化成一个query,并生成查询计划

与statement不同的是,Query包含了查询计划以及后面要介绍的Stage、Task、Split等很多用来进行数据计算的概念和组件,可以理解为statement就是sql语句,而query是一次查询执行

Stage

presto在执行Query的时候,会把每一个query切分成多个前后关联的stage,但这只是一个逻辑概念,是在coordinator中用来生成分布式查询计划的,本身不会在worker中执行

stage可以分为以下四种:

  • Source:负责连接数据源,从数据源读取数据的一个阶段
  • Fixed:接收其他stage的产出作为输入,然后对数据进行分布式计算的stage
  • Single(Root):聚合其他stage的产出,并将数据输出给用户的阶段
  • Coordinator_Only:执行DDL、DML相关的stage

Task

stage逻辑上又被分为一系列的task,这些task就是后面要实际在worker上执行的任务,并且这些task可以并行的执行

Split

split:数据分片,是对数据集的一个切分,每个task负责处理一个或多个数据split

Operator

一个Operator代表对Split的一种操作,比如过滤、加权、转换等。一个Operator回依次读取每个数据分片重的数据,并将operator代表的计算和操作应用在数据上,然后产生输出

Driver

一个task包含多个Driver,其中,Driver是一系列Operator的集合,并且将相应的输出传递给他的task,task将收集到的输出结果传送给下一个stage中的一个task

Exchange

presto的stage通过exchange来进行数据传递,可以分为output buffer和exchange client两种。

其中,生产数据的stage通过output buffer将数据传递给下游的stage,消费数据的stage通过exchange client丛上游stage读取数据