1 诞生背景
Presto 是一个 基于MPP(Massively Parallel Processing,大规模并行处理)架构的高性能分布式 SQL 查询引擎,它能够对分布在一个或多个不同数据源中的大数据集进行快速查询。
旨在解决大数据处理中MapReduce模型在交互式分析上的低效性问题。它通过采用分布式架构、基于内存的计算、交换技术和多阶段执行计划,能够在秒级时间内处理从 GB 到 PB 级别的数据查询。同时,Presto支持多种数据源连接和标准SQL语法,提供了灵活而强大的数据查询能力,满足了对实时、高效、多样化数据分析的需求。
2 Presto 和 Trino 的关系与发展历史
-
Presto 的起源:
- Presto 最初由 Facebook 开发,目的是为了满足公司内部大规模数据查询的需求。它被设计为一个高性能的分布式 SQL 查询引擎,能够处理 PB 级别的数据量,并且支持多种数据源。
- Presto 的开发始于 2012 年,并于 2013 年开源。
-
Presto 社区的分裂:
- 随着 Presto 的普及和使用范围的扩大,社区内部出现了一些分歧,特别是在 Facebook 和一些外部贡献者之间。
- 这些分歧主要集中在项目治理、贡献流程和版本发布等方面。
-
PrestoSQL 的诞生:
- 为了应对这些问题,一部分社区成员决定创建一个新的分支,称为 PrestoSQL,这个分支致力于提供一个更加开放和包容的开发环境。
- PrestoSQL 项目开始于 2018 年左右,它继续沿用了 Presto 的核心功能,并且致力于改进和增强原有的特性。
-
PrestoSQL 重命名为 Trino:
- 2020 年底,为了与 Facebook 维护的原始 Presto 项目进一步区分开来,PrestoSQL 项目正式更名为 Trino。
- Trino 的名称灵感来源于中微子(neutrinos),这些粒子既轻又移动迅速,寓意着 Trino 引擎的轻量级和高速度。
- Trino 保留了 Presto 的核心特性和功能,同时继续进行新的开发和创新。
-
当前状态:
- PrestoDB: Facebook 维护的原始 Presto 项目继续存在,并且仍被一些组织使用。
- Trino (前 PrestoSQL): Trino 成为了一个独立的项目,并且拥有活跃的社区支持和开发。Trino 继续发展成为一个成熟且功能丰富的分布式 SQL 查询引擎,支持多种数据源,并且具有出色的性能。
3 核心特性
下列特性在Trino中同样适用,Trino作为Presto的继承者,继续发展和完善这些特性。
-
高性能与低延迟:
- 采用流水线式的查询处理模式,将查询分解为多个独立的阶段,每个阶段在不同的节点上并行执行,通过并行处理和基于内存的计算、交互,支持亚秒级甚至毫秒级的查询响应。
- 优化了数据扫描、聚合和过滤等操作,以减少I/O和网络延迟,从而提高整体查询性能。
-
分布式架构:
- 可以水平扩展以处理PB级的数据量,通过添加更多的节点来增加查询处理能力和存储容量。
- 支持跨多个节点的分布式查询执行,自动将查询分解成多个子任务,并在集群中的节点间并行处理。
-
多数据源支持与可扩展性:
- Presto通过不同的Connector连接到多种数据源,如Hive、Cassandra、MySQL、PostgreSQL、Oracle等。
- 这使得Presto能够跨越不同的存储系统执行联邦查询,从而满足多样化的数据需求。
- 架构允许添加新的Connector来支持新的数据源。
- 支持自定义函数(UDF)和自定义聚合函数(UDAF),以满足特定的业务需求。
-
资源管理:
- 支持动态资源管理和调度,可以根据需要调整节点资源的分配。
- 支持查询优先级和资源配额,以确保重要的查询得到及时执行。
-
标准SQL支持:
- Presto支持ANSI SQL标准,用户可以使用熟悉的SQL语法进行查询,降低了学习曲线。
- 支持复杂的SQL查询,包括聚合、联接、窗口函数等,使得数据分析师和开发人员可以轻松地编写高效的查询语句。
4 架构设计
Presto 架构主要分为三部分:协调器(Coordinator)、服务注册(Discovery Service)和工作节点(Worker)。
coordinator:负责节点管理、sql解析、执行计划、任务调度、汇总结果。
Discovery Service:保存、同步Worker节点状态。
worker:负责计算与读写。
以下是各部分的简要说明:
- ResourceGroup:队列接收用户的查询请求。
- Planner/Optimizer:规划器/优化器负责解析和优化查询,生成执行计划。
- Scheduler:调度器负责将任务分配给工作节点。
- Metadata API:获取元数据服务,如表名、列名、分区信息等。
- Data Source/Location API:数据源API,用于读取和写入数据。
- External Storage System:外部存储系统,可能是HDFS、S3或者其他的文件系统。
5 与Hive的差异
6 基本概念
Presto 使用Catalog
中的一套配置通过 Connector
连接数一个据源,使用 Catalog.Schema.Table
这3层结构定位一个表:
- Connector:这是Presto与数据源之间交互的接口实现,如Hive、PostgreSQL或者其他可用的数据源。连接器允许Presto访问外部数据源上的数据。
- Catalog:包含模式和通过连接器引用的数据源的一套配置。在RDBMS(如PostgreSQL和MySQL)中,目录相当于数据库的概念。一个Catalog可以包含多个Schema,可以通过
show catalogs
命令看到Presto已连接的所有数据源。 - Schema:组织一组表。在RDBMS中,这与数据库中的概念相同。
- Table:表示数据集合,包括行、列和关联的数据类型。
Presto 调度查询,Coordinator 跟踪每个Worker运行什么Task,哪些Split正在被处理,涉及的不同组件及其作用:
- Statement:语句基于ANSI SQL标准的文本SQL
语句
,由子句、表达式和谓词组成。在Presto中,当语句执行时,用户输入的SQL语句被解析成一个查询和分布式查询计划并在Worker上运行。 - Query:经过解析后的SQL语句形成了一个
查询
,并创建一个分布式查询计划。语句是存SQL文本,而查询是配置和实例化的组件。一个查询包含:Stage、Task、Split、Connector、其他组件和数据源。 - Stage:查询会被拆分为有树形层次结构的stage,stage是分布式查询计划(distributed query plan)的模型,但不是由工作节点直接执行的。
- Fragment:基本等价于 Stage,属于在不同阶段的称呼,可以认为两者等价,是由工作节点真正执行的。
- Task:Stage不是在worker上直接运行的。stage又会被分为多个task,真正在不同的work上执行是task。一个分布式查询计划会被拆分为多个stage,并再转为task,然后task就运行或处理split。Task有输入和输出,一个stage可以分为多个并行执行的task,一个task可以分为多个并行执行的driver。每个task可能包含一个或多个并行驱动器(Driver)。
- Driver:Task包含一个或多个并行的driver。Driver在数据上处理,并生成输出,然后由Task聚合,最后传送给stage的其他task。一个driver是Operator的序列。driver是Presto最底层的并行机制。一个driver有一个输出和一个输入。
- Pipeline:一个Stage中包括一个或者多个Pipeline,一个Pipeline中包括多个Driver,数据在同一个Pipeline的内部Driver间数据交换不需要经过网络,在Pipeline与Pipeline之间也只经过内存Exchange在本地进行数据交换。
- Split:Split 是指数据分片,即大数据集中的子集。Driver 是操作集合,作用于一个分片上。每个节点的 Task 包含多个 Driver,因此一个 Task 可以处理多个 Split。操作由 Operator 表示。在分布式查询执行计划中,Source Stage 通过 Connector 从数据源获取多个分片。处理完 Split 后,Source Stage 将输出传递给下游 Stage。当 Presto 执行查询时,首先从 Coordinator 获取表的所有 Split,然后根据查询执行计划选择合适的节点运行相应的 Task 处理 Split。
- Operator:一个Operator代表对一个Spit的一种操作,例如过滤、加权、转换等。一个Operator依次读取一个Split中的数据,将Operator所代表的计算和操作作用于Split的数据上,并产生输出。每个Operator均会以Page为最小处理单元分别读取输入数据和产生输出数据。Operator每次只会读取一个Page对象,相应地,每次也只会产生一个Page对象。
- Exchange:Exchange在Presto结点的不同Stage之间传送数据,Task生产和消费数据是通过Exchange客户端。
7 使用场景
由于其高性能和灵活的数据源接入能力,Presto 特别适合以下场景:
- 数据分析: 分布式 SQL 查询引擎,对大数据集中的复杂查询进行快速响应,做到秒级返回。
- 数据仓库: 与传统的数据仓库技术相比,Presto 可以提供更快速、成本效益更高的解决方案。
- 数据湖探索: 在多种格式和来源的数据上执行交互式查询,可连接 Hive、MySQL、Kafka 等。
8 总结
Presto 是一个强大且灵活的分布式 SQL 查询引擎,专为今日的数据规模和复杂性设计。无论是性能、可扩展性还是易用性,Presto都是处理大数据的理想选择。随着技术的不断进步和社区的发展,Presto将继续在大数据领域扮演重要角色。
9 参考资料
-
官方文档
-
各大公司的实践
-
书籍文献
- 《Presto: SQL on everything》
- 《Presto: The Definitive Guide》:Presto三巨头写的Presto入门书籍。
- 《Presto技术内幕》:京东Presto团队写的Presto的书籍。
-
必读文章
-
资料网站
- Facebook Enginerring网站: Facebook关于Presto的一些开发进展在这个网站会有公布。
- Presto中国知乎社区: 阿里云数据湖分析团队维护的Presto中国知乎社区。
- Presto News公众号: 阿里云数据湖分析团队维护的Presto公众号。
- Learn BigData-Presto
- 若飞的Presto博客
-
聊天群
- PrestoDB: prestodb.slack.com
- TrinoDB: prestosql.slack.com
- Presto中国社区(钉钉群): 阿里云数据湖分析团队维护的Presto中国钉钉群。
-
Presto as a Service
-
Youtube频道