Presto入门介绍
- 背景
- 概念
- Presto基本概念
- 数据模型
- Presto架构模型
- 查询模型
- 工作原理
- Presto架构图
- Presto查询执行过程
- 优势
- 缺点
- 参考
背景
Hive等数据处理工具使用MapReduce作为底层处理框架,处理简单的数据,响应时间还可以接受,但随着数据量的增加,使用Hive哪怕进行简单的数据处理都在分钟级甚至小时级别,这显然不能满足现在实时交互的需求。Presto是FaceBook于2012年开发的项目,并于2013年开源。目前国内运用Presto比较成熟的有京东、美团等。
概念
Presto是一个运行在分布式系统上的分布式系统,用于查询分布在一个或多个不同数据源之间的大数据集。Presto并不是一个数据库,但是可以接入多种数据源有多种,包括:Hive、Mysql、ES、Kafka、Cassandra、Mongo、Redis等。
Presto基本概念
数据模型
Presto使用Catalog,Schema,Table三层结构来管理数据。
- Catalog表示数据源。每一个连接的数据源都有一个名字,我们可以用show catalogs来查看目前连接的数据源。
- Schema表示一个数据库实例。我们可以用show schemas from catalog_name,来查看catalog_name下所有的数据库。
- Table表示一个数据表实例。我们可以通过show tables from catalog_name.schema_name,来查看catalog_name.schema_name数据库下的所有的数据表。
Presto架构模型
Presto是一个Master-Slaves主从拓扑结构,一个完全分布式的Presto架构包括一个Coordinator节点和若干个Worker节点。
- Coordinator:Coordiantor节点部署在一个单独的节点上,是整个Presto集群的管理节点,主要工作是管理Presto集群,包括:接受PrestoCLI等提交的查询、查询语句的解析、查询计划的生成、任务调度等。
- Worker:Worker节点是Presto集群的工作节点,进行数据处理和任务执行,并定期向Coordinator发送心跳包。
查询模型
从PrestoCLI等客户端提交查询语句开始,Coordinator根据查询语句生成查询计划,进而生成可以执行的查询,一个查询计划包括以下几个组成部分:Stage、Task、Driver、Split、Operator、DataSource组成。
- Stage:执行查询阶段,RootStage将结果返回给Coordinator,SourceStage接受Coordinator的数据。
- Exchange:上下游Stage通过Exchange交换数据,主要包含量中Exchange,一种是OutputBuffer,用来生产数据,并通过此Exchange数据向下游Stage传递数据;另一种是ExchangeClient,下游Stage通过此Exchange消费数据。当Stage是SourceStage,则此Stage通过Operator和Connector进行数据交互。
- Split:大数据集中的一部分。
- Task:每个Task处理一个或多个Split。
- Driver:一个Task被分成一个或多个Driver,一个Driver处理一个Split。
- Page:Presto处理数据的最小数据单元,一个Page包含由字节数组组成的多个Block组成。存储一个字段的若干行,多个Block横切构成一个真实的一行数据。一个Page最大为1M,最多为16*1024行数据。
工作原理
Presto架构图
Presto查询执行过程
- 提交查询
Presto CLI等客户端通过HTTP协议将查询语句提价到Coordinator,接到SQL查询语句后,通过SQLParser将查询语句解析成Statement对象,如果语法解析有误,将在此阶段暴漏,如果无误将Statement封装成QueryStarter对象放入线程池中等待。 - 生成执行计划
如果语法检查无误,通过逻辑查询计划器组件,查询metadata中的元数据信息,与第一步生成的语法树对应起来,生成物理逻辑查询树,如果有误,在此处暴漏。 - 生成物理执行计划
如果第三步检查通过,会得到一个逻辑的查询计划,coordinate会根据是否有shuffle将逻辑查询计划拆分成subplan,最后转换成一个一个Task,每一个Task会将位置解析出来,并将Task交给执行Plan,并由Plan将Task分给Worker执行。
优势
- 完全基于内存的并行计算
- 流水线计算
- 本地化计算
- 动态编译执行计划
- GC控制
- 类BlinkDB的近似查询
缺点
因为Presto的全部数据是存在内存中的,限制了内存中数据集的大小,例如多个大表的join操作。因此,Presto是取代不了Hive的。