本系列主要会记录笔者在学习和使用 Presto 过程中学习记录及所遇到的问题和解决的方法,会不定期更新,同时也欢迎各位同鞋在文末留言一起探讨使用心得~

Presto 简介

Presto 是一款由 Facebook 开源的分布式 SQL 查询引擎,被设计为使用 MapReduce 作业管道 ( 如 Hive 或 Pig ) 查询HDFS的替代工具,用于对从 GB 到 PB 级别的各种大小的数据源运行交互式分析查询,并实现秒级和分钟级响应。它是一个符合 ANSI SQL 的查询引擎,允许用户将他们喜欢的数据工具(包括 BI 和 ETL 工具)与任何底层数据源集成。它本身并不存储数据,而是通过它自身的 connector 对接数据源拉取数据从而实现查询, 同时由于它可以支持丰富的 connector,所以我们可以定义不同的 connector 来对接不同的数据源,从而实现从不同数据源获取数据实现跨数据源的关联查询。Presto 旨在处理数据仓库和分析:数据分析、聚合大量数据并生成报告,即在线分析处理 (OLAP)。
目前 presto 分为 PrestoDB 和 PrestoSQL(Trino)两个版本,在2020年12月27日, prestosql 与 facebook 正式分裂, 由于版权问题,改名为 trino。

笔者目前使用的是 prestosql-333 版本,主要用来加速 Hive 数据查询及多数据源联邦查询。

Presto 特点

  1. 多数据源:目前 Presto 可以支持 Accumulo、BigQuery、Black Hole、Cassandra、ClickHouse、Druid、Elasticsearch、Google Sheets、Iceberg、Hive、JMX、Kafka、Kinesis、Kudu、Local File、Memory、MongoDB、MySQL、Oracle、Phoenix、Pinot、PostgreSQL、Prometheus、Redis、Redshift、SingleStore (MemSQL)、SQL Server、System、Thrift、TPCDS、TPCH 等多种数据源;
  2. 支持 SQL:Presto 很好的支持 ANSI SQL,用户可以使用 ANSI SQL 进行数据查询;
  3. 扩展性好:用户可以通过自定以 Connector 实现对接自己特定的数据源;
  4. 混合计算:Presto 可以通过定义不同种类的 Connector 实现不同数据源的混合计算;
  5. 高性能:Presto 的查询性能平均在 Hive 的 10 倍左右;
  6. 流水线:Presto 是基于 PipeLine 进行计算的,在大数据查询 sql 中,查询结果会分段返回,用户不必等到查询全部完成后才能看到结果。

Presto 架构

Presto 的架构中包括了 Client,Coordinator,Discovery Server,Worker ,Connector 五种角色。

如下图所示:

presto 使用已有的schema presto insert into_presto

  1. Client:客户端,发送用户的操作指令,例如:select,show catalog,show schemas 等;
  2. Coordinator:协调者,主要负责处理客户端提交的语句,负责解析语句、生成查询计划并提交给对应的 worker、规划查询和管理 Worker 的服务器,并将从 Worker 中获取结果返回给客户端。集群中必须有一个 Coordinator;
  3. Discovery Server:服务发现,Coordinator 和 Worker 启动后会将地址注册到 Discovery Server,Coordinator 和 Worker 分别从 Discovery Server 获取 Worker 和 Coordinator 的地址,做到了Coordinator 和 Worker的完全解藕,默认情况下 Discovery Server 内嵌在 Coordinator 中。集群中必须有一个 Discovery Server;
  4. Worker:工作节点,集群中正在执行任务和处理数据的地方,工作节点从 Connector 获取数据并相互交换中间数据,完成查询,并将查询结果返回给 Coordinator 。
  5. Connector:连接器,用户通过配置文件配置,在集群启动时加载,负责在 Worker 查询时不同的 Connector 从对应的 DataSource 拉取数据到 Worker。

Presto 相关概念

在 Presto 中我们定位一张数据表的完整路径为:catalog.schema.table

Presto 模型

Catalog

在 Presto 中,Catalog 类似于一个 Mysql 的实例,Catalog 位于定位一个表的最外层,我们可以通过在 etc/catalog 文件加下建立 xx.properties 文件来定义一个 catalog,对应的 catalog 则对应一个类型的 connector ,而一个类型的 connector 可以有多个 catalog。

Schema

在 Presto中,Schema 类似于 Mysql 里面的数据库的概念,在定位一张表的中间层,它的数量和定义的 catalog 表示的实例的数量一至的,比如说:我们定义了一个 Mysql 的 Catalog,那么该 Catalog 的 Schema 数就和对应的 Mysql 实例中的数据库数量是一至的。

Table

同样的,在 Presto中,Table 类似于 Mysql 里面的表的概念,它的数量和定义的 catalog 表示的实例的数量一至的,比如说:我们定义了一个 Mysql 的 Catalog,那么该 Catalog 下的某个 Schema 的 Table 数就和对应的 Mysql 实例中的对应的某个数据库下的表数量是一至的。

Presto 查询模型

Presto 是一个分布式 SQL 查询引擎,在执行一条 SQL 语句时,这些 SQL 会被解析成对应的 Task 分发到不同的 Worker 机器上进行执行。

在 Presto 中,当一条 SQL 语句被提交到集群时会被转换成为一个可以由 Presto 解析执行的**查询执行(Query)相关的执行计划,**一个 Query 会被拆分成多个具有层级关系的 Stage,每个 Stage 在逻辑上会被分成多个 Task 真正提交到 Worker 上进行计算,同样的,每个 Task 会划分成多个 Driver,从而行的执行一个 Task。而一个 Task 会分为多个 Driver,一个 Driver 包含一系列 Operator 处理一个 Split,一个 Operator 代表一个操作,而一个 Split 代表一个数据表的子集。

Statement

在 Presto 中 Statement 就是我们输入的 SQL 语句。

Query

在 Presto 中 Query 表示查询执行。当接收到一个 SQL 语句并执行的时候,Presto 会将该 SQL 语句进行解析,将其转换成一个查询执行和相关的查询计划。一个查询执行代表可以在 Presto 集群执行的查询,它由多个 Stage 组成。

Stage

在 Presto 中 Stage 表示查询执行阶段。当 Presto 运行一个 Query 时,会将其拆分成多个 Stage,一个 Stage 代表 Query 的一部分。
其中 Stage 被分为4类:

  1. Coordinator_Only:用于执行 DDL(Data Definition Language) 或 DML(Data Manipulation Language)语句;
  2. Single:用于聚合子 Stage 数据并返回给 Coordinator,并由 Coordinator 返回给用户;
  3. Fixed:接受子 Stage 数据并在集群中对这些数据进行分布式计算;
  4. Source:直接连接数据源,从数据源读取数据,该阶段会根据执行计划进行相关的数据过滤以减少读取的数据量。

Exchange

在 Presto 中 Exchange 用来连接 Stage,完成不同 Stage 之间的数据交换。
其中 Exchange 被分为两类:

  1. Output Buffer : 用于将数据传送给下游 Stage;
  2. Exchange Client:用于从上游 Stage 接收数据。

对于 Source 类型的 Stage,该 Stage 使用 Source Operator 直接从数据源读取数据

Task

在 Presto 中,Stage 被逻辑上分为一系列的 Task,这些 Task 则是实际运行在 Presto 的各个 Worker 节点上。

Driver

在 Presto 中,一个 Task 包含一个或多个 Driver,一个 Driver 其实是作用于一个 Split 的一系列 Operator 集合。因此一个 Dirver 处理一个 Split,并输出相应的数据,并由 Task 收集输出到下游 Stage 的一个 Task。一个 Driver 拥有一个输入个一个输出。

Operator

在 Presto 中,一个 Operator 代表一个 Split 的一种操作,并进行相应的操作,然后输出数据。每个 Operator 会以 Page 为最小单位分别读取和输出数据。每次只会读取及输出一个 Page。

Split

在 Presto 中,Split 表示一个大数据集中的一个小的子集。当 Presto 执行一个查询的时候,首先会从 Coordinator 得到一个数据表对应的所以的 Split,然后根据查询执行计划选择节点执行 Task 处理对应的 Split。

由于 Driver 是处理一个 Split 的一系列操作的集合,而一个 Task 包含多个 Driver,所以一个 Task 可以操作多个 Split。

Page

在 Presto 中,Page 是处理数据的最小单元,一个 Page 对象包含多个 Block 对象,每个 Block 对象是一个字节数组,存储一个字段的若干行。多个 Block 横切的一行就是真实的一行数据。

一个 Page 最大 1MB,最多 16*1024 行数据。

Presto 查询模型图示大致如下:

presto 使用已有的schema presto insert into_presto 使用已有的schema_02

结语

本文从 Presto 是什么、能干什么、有哪些特点入手介绍 Presto 基础功能及作用,同时介绍了 Presto 的基础架构及组成,对 Presto 的架构和查询中的基本概念做了基本描述,希望可以帮助初学者快速了解 Presto 。