Presto & Trino 介绍(一)

501 阅读9分钟

1 诞生背景

Presto 是一个 基于MPP(Massively Parallel Processing,大规模并行处理)架构的高性能分布式 SQL 查询引擎,它能够对分布在一个或多个不同数据源中的大数据集进行快速查询。

旨在解决大数据处理中MapReduce模型在交互式分析上的低效性问题。它通过采用分布式架构、基于内存的计算、交换技术和多阶段执行计划,能够在秒级时间内处理从 GB 到 PB 级别的数据查询。同时,Presto支持多种数据源连接和标准SQL语法,提供了灵活而强大的数据查询能力,满足了对实时、高效、多样化数据分析的需求。

2 Presto 和 Trino 的关系与发展历史

  1. Presto 的起源:

    • Presto 最初由 Facebook 开发,目的是为了满足公司内部大规模数据查询的需求。它被设计为一个高性能的分布式 SQL 查询引擎,能够处理 PB 级别的数据量,并且支持多种数据源。
    • Presto 的开发始于 2012 年,并于 2013 年开源。
  2. Presto 社区的分裂:

    • 随着 Presto 的普及和使用范围的扩大,社区内部出现了一些分歧,特别是在 Facebook 和一些外部贡献者之间。
    • 这些分歧主要集中在项目治理、贡献流程和版本发布等方面。
  3. PrestoSQL 的诞生:

    • 为了应对这些问题,一部分社区成员决定创建一个新的分支,称为 PrestoSQL,这个分支致力于提供一个更加开放和包容的开发环境。
    • PrestoSQL 项目开始于 2018 年左右,它继续沿用了 Presto 的核心功能,并且致力于改进和增强原有的特性。
  4. PrestoSQL 重命名为 Trino:

    • 2020 年底,为了与 Facebook 维护的原始 Presto 项目进一步区分开来,PrestoSQL 项目正式更名为 Trino
    • Trino 的名称灵感来源于中微子(neutrinos),这些粒子既轻又移动迅速,寓意着 Trino 引擎的轻量级和高速度。
    • Trino 保留了 Presto 的核心特性和功能,同时继续进行新的开发和创新。
  5. 当前状态:

    • PrestoDB: Facebook 维护的原始 Presto 项目继续存在,并且仍被一些组织使用。
    • Trino (前 PrestoSQL): Trino 成为了一个独立的项目,并且拥有活跃的社区支持和开发。Trino 继续发展成为一个成熟且功能丰富的分布式 SQL 查询引擎,支持多种数据源,并且具有出色的性能。

3 核心特性

下列特性在Trino中同样适用,Trino作为Presto的继承者,继续发展和完善这些特性。

  1. 高性能与低延迟

    • 采用流水线式的查询处理模式,将查询分解为多个独立的阶段,每个阶段在不同的节点上并行执行,通过并行处理和基于内存的计算、交互,支持亚秒级甚至毫秒级的查询响应。
    • 优化了数据扫描、聚合和过滤等操作,以减少I/O和网络延迟,从而提高整体查询性能。
  2. 分布式架构

    • 可以水平扩展以处理PB级的数据量,通过添加更多的节点来增加查询处理能力和存储容量。
    • 支持跨多个节点的分布式查询执行,自动将查询分解成多个子任务,并在集群中的节点间并行处理。
  3. 多数据源支持与可扩展性

    • Presto通过不同的Connector连接到多种数据源,如Hive、Cassandra、MySQL、PostgreSQL、Oracle等。
    • 这使得Presto能够跨越不同的存储系统执行联邦查询,从而满足多样化的数据需求。
    • 架构允许添加新的Connector来支持新的数据源。
    • 支持自定义函数(UDF)和自定义聚合函数(UDAF),以满足特定的业务需求。
  4. 资源管理

    • 支持动态资源管理和调度,可以根据需要调整节点资源的分配。
    • 支持查询优先级和资源配额,以确保重要的查询得到及时执行。
  5. 标准SQL支持

    • Presto支持ANSI SQL标准,用户可以使用熟悉的SQL语法进行查询,降低了学习曲线。
    • 支持复杂的SQL查询,包括聚合、联接、窗口函数等,使得数据分析师和开发人员可以轻松地编写高效的查询语句。

4 架构设计

Presto 架构主要分为三部分:协调器(Coordinator)、服务注册(Discovery Service)和工作节点(Worker)。
coordinator:负责节点管理、sql解析、执行计划、任务调度、汇总结果。
Discovery Service:保存、同步Worker节点状态。 worker:负责计算与读写。

image.png

以下是各部分的简要说明:

  1. ResourceGroup:队列接收用户的查询请求。
  2. Planner/Optimizer:规划器/优化器负责解析和优化查询,生成执行计划。
  3. Scheduler:调度器负责将任务分配给工作节点。
  4. Metadata API:获取元数据服务,如表名、列名、分区信息等。
  5. Data Source/Location API:数据源API,用于读取和写入数据。
  6. External Storage System:外部存储系统,可能是HDFS、S3或者其他的文件系统。

5 与Hive的差异

图片.png

6 基本概念

Presto 使用Catalog中的一套配置通过 Connector 连接数一个据源,使用 Catalog.Schema.Table 这3层结构定位一个表:

  1. Connector:这是Presto与数据源之间交互的接口实现,如Hive、PostgreSQL或者其他可用的数据源。连接器允许Presto访问外部数据源上的数据。
  2. Catalog:包含模式和通过连接器引用的数据源的一套配置。在RDBMS(如PostgreSQL和MySQL)中,目录相当于数据库的概念。一个Catalog可以包含多个Schema,可以通过show catalogs命令看到Presto已连接的所有数据源。
  3. Schema:组织一组表。在RDBMS中,这与数据库中的概念相同。
  4. Table:表示数据集合,包括行、列和关联的数据类型。

Presto 调度查询,Coordinator 跟踪每个Worker运行什么Task,哪些Split正在被处理,涉及的不同组件及其作用:

  1. Statement:语句基于ANSI SQL标准的文本SQL语句,由子句、表达式和谓词组成。在Presto中,当语句执行时,用户输入的SQL语句被解析成一个查询和分布式查询计划并在Worker上运行。
  2. Query:经过解析后的SQL语句形成了一个查询,并创建一个分布式查询计划。语句是存SQL文本,而查询是配置和实例化的组件。一个查询包含:Stage、Task、Split、Connector、其他组件和数据源。
  3. Stage:查询会被拆分为有树形层次结构的stage,stage是分布式查询计划(distributed query plan)的模型,但不是由工作节点直接执行的。
  4. Fragment:基本等价于 Stage,属于在不同阶段的称呼,可以认为两者等价,是由工作节点真正执行的。
  5. Task:Stage不是在worker上直接运行的。stage又会被分为多个task,真正在不同的work上执行是task。一个分布式查询计划会被拆分为多个stage,并再转为task,然后task就运行或处理split。Task有输入和输出,一个stage可以分为多个并行执行的task,一个task可以分为多个并行执行的driver。每个task可能包含一个或多个并行驱动器(Driver)。
  6. Driver:Task包含一个或多个并行的driver。Driver在数据上处理,并生成输出,然后由Task聚合,最后传送给stage的其他task。一个driver是Operator的序列。driver是Presto最底层的并行机制。一个driver有一个输出和一个输入。
  7. Pipeline:一个Stage中包括一个或者多个Pipeline,一个Pipeline中包括多个Driver,数据在同一个Pipeline的内部Driver间数据交换不需要经过网络,在Pipeline与Pipeline之间也只经过内存Exchange在本地进行数据交换。
  8. Split:Split 是指数据分片,即大数据集中的子集。Driver 是操作集合,作用于一个分片上。每个节点的 Task 包含多个 Driver,因此一个 Task 可以处理多个 Split。操作由 Operator 表示。在分布式查询执行计划中,Source Stage 通过 Connector 从数据源获取多个分片。处理完 Split 后,Source Stage 将输出传递给下游 Stage。当 Presto 执行查询时,首先从 Coordinator 获取表的所有 Split,然后根据查询执行计划选择合适的节点运行相应的 Task 处理 Split。
  9. Operator:一个Operator代表对一个Spit的一种操作,例如过滤、加权、转换等。一个Operator依次读取一个Split中的数据,将Operator所代表的计算和操作作用于Split的数据上,并产生输出。每个Operator均会以Page为最小处理单元分别读取输入数据和产生输出数据。Operator每次只会读取一个Page对象,相应地,每次也只会产生一个Page对象。
  10. Exchange:Exchange在Presto结点的不同Stage之间传送数据,Task生产和消费数据是通过Exchange客户端。

7 使用场景

由于其高性能和灵活的数据源接入能力,Presto 特别适合以下场景:

  • 数据分析: 分布式 SQL 查询引擎,对大数据集中的复杂查询进行快速响应,做到秒级返回。
  • 数据仓库: 与传统的数据仓库技术相比,Presto 可以提供更快速、成本效益更高的解决方案。
  • 数据湖探索: 在多种格式和来源的数据上执行交互式查询,可连接 Hive、MySQL、Kafka 等。

8 总结

Presto 是一个强大且灵活的分布式 SQL 查询引擎,专为今日的数据规模和复杂性设计。无论是性能、可扩展性还是易用性,Presto都是处理大数据的理想选择。随着技术的不断进步和社区的发展,Presto将继续在大数据领域扮演重要角色。

9 参考资料