Presto 概念

概述

要了解 Presto,您首先需要了解 Presto 文档中使用的术语和概念。

虽然理解语句和查询很容易,但作为最终用户,您应该熟悉阶段和切片等概念,以充分利用 Presto 来执行高效的查询。 作为 Presto 管理员或 Presto 贡献者,您应该了解 Presto 的阶段如何映射到任务,以及任务如何包含一组处理数据的驱动程序。

本节提供了 Presto 中所有引用核心概念的定义,这些章节按从最一般到最具体的顺序排列。

服务器类型

Presto 服务器有三种类型:资源管理器、协调器和工作节点。 下面解释了它们之间的区别。

资源管理器

Presto 资源管理器是汇总来自所有协调器和工作节点的数据并构建集群全局视图的服务器。 具有分散协调器的 Presto 安装需要资源管理器。 集群支持多个资源管理器,每个资源管理器充当主资源管理器。

协调器和工作节点使用 thrift API 与资源管理器通信。

协调器

Presto 协调器是负责解析语句、计划查询和管理 Presto 工作节点的服务器。 它是 Presto 安装的“大脑”,也是客户端连接以提交语句以供执行的节点。 每个 Presto 安装都必须有一个 Presto 协调器以及一个或多个 Presto 工作节点。 出于开发或测试目的,可以将 Presto 的单个实例配置为执行这两种角色。

协调器跟踪每个工作节点上的活动并协调查询的执行。 协调器创建查询的逻辑模型,其中包含一系列阶段,然后将其转换为在 Presto 工作节点集群上运行的一系列连接的任务。

协调器使用 REST API 与工作节点和客户端通信。

工作节点

Presto 工作节点是 Presto 安装中的服务器,负责执行任务和处理数据。 工作节点从连接器获取数据并在彼此之间交换中间数据。 协调器负责从工作节点获取结果并将最终结果返回给客户端。

当 Presto 工作节点进程启动时,它会在协调器中的发现服务器上进行自我宣传,使其可供 Presto 协调器用于任务执行。

工作节点使用 REST API 与其他工作节点和 Presto 协调器通信。

数据源

在本文档中,您将看到连接器、元数据、模式和表等术语。 这些基本概念涵盖了 Presto 的特定数据源模型,并在以下部分中进行了描述。

连接器

连接器使 Presto 能够适应数据源,例如 Hive 或关系型数据库。 您可以将连接器视为数据库驱动程序。 它是 Presto SPI 的实现,允许 Presto 使用标准 API 与资源进行交互。

Presto 包含几个内置连接器:一个用于 JMX 的连接器,一个 系统 连接器,提供对内置系统表的访问,一个 Hive 连接器,以及一个 TPCH 连接器,旨在提供 TPC-H 基准测试数据。 许多第三方开发人员贡献了连接器,以便 Presto 能够访问各种数据源中的数据。

每个元数据都与特定连接器相关联。 如果您检查元数据配置文件,您将看到每个文件都包含一个强制属性 connector.name,该属性由元数据管理器用于为给定元数据创建连接器。 可以让多个元数据使用相同的连接器来访问两个不同实例的类似数据库。 例如,如果您有两个 Hive 集群,您可以在单个 Presto 集群中配置两个元数据,它们都使用 Hive 连接器,从而允许您查询来自这两个 Hive 集群的数据(甚至可以在同一个 SQL 查询中)。

元数据

Presto 元数据包含模式,并通过连接器引用数据源。 例如,您可以配置 JMX 元数据以通过 JMX 连接器提供对 JMX 信息的访问。 当您在 Presto 中运行 SQL 语句时,您是在针对一个或多个元数据运行它。 元数据的其他示例包括用于连接到 Hive 数据源的 Hive 元数据。

在 Presto 中引用表时,完全限定的表名始终以元数据为根。 例如,完全限定的表名 hive.test_data.test 将引用 hive 元数据中 test_data 模式中的 test 表。

元数据在存储在 Presto 配置目录中的属性文件中定义。

模式

模式是组织表的一种方式。 元数据和模式共同定义了一组可查询的表。 当您使用 Presto 访问 Hive 或关系型数据库(如 MySQL)时,模式会转换为目标数据库中的相同概念。 其他类型的连接器可以选择以对底层数据源有意义的方式将表组织到模式中。

表是一组无序行,这些行被组织到具有类型的命名列中。 这与任何关系型数据库中一样。 从源数据到表的映射由连接器定义。

查询执行模型

Presto 执行 SQL 语句并将这些语句转换为在协调器和工作节点的分布式集群上执行的查询。

语句

Presto 执行与 ANSI 兼容的 SQL 语句。 当 Presto 文档引用语句时,它指的是 ANSI SQL 标准中定义的语句,这些语句由子句、表达式和谓词组成。

一些读者可能好奇为什么本节单独列出了语句和查询的概念。 这是必要的,因为在 Presto 中,语句仅指 SQL 语句的文本表示形式。 当执行语句时,Presto 会创建一个查询以及一个查询计划,然后将其分布到一系列 Presto 工作节点中。

查询

当 Presto 解析语句时,它会将其转换为查询并创建一个分布式查询计划,然后将其实现为在 Presto 工作节点上运行的一系列相互连接的阶段。 当您检索有关 Presto 中查询的信息时,您将获得正在参与生成响应于语句的结果集的每个组件的快照。

语句和查询之间的区别很简单。 语句可以被认为是传递给 Presto 的 SQL 文本,而查询指的是为了执行该语句而实例化的配置和组件。 查询包含阶段、任务、切片、连接器和其他组件以及协同工作以生成结果的数据源。

阶段

当 Presto 执行查询时,它会将执行分解成一个阶段层次结构。例如,如果 Presto 需要聚合存储在 Hive 中的十亿行数据,它会创建一个根阶段来聚合其他几个阶段的输出,所有这些阶段都旨在实现分布式查询计划的不同部分。

构成查询的阶段层次结构类似于树。每个查询都具有一个根阶段,该阶段负责聚合来自其他阶段的输出。阶段是协调器用来模拟分布式查询计划的东西,但阶段本身不会在 Presto 工作器上运行。

任务

如上一节所述,阶段模拟分布式查询计划的特定部分,但阶段本身不会在 Presto 工作器上执行。要了解阶段是如何执行的,您需要了解阶段是如何实现为分布在 Presto 工作器网络上的任务序列的。

任务是 Presto 架构中的“主力军”。分布式查询计划被分解成一系列阶段,然后被转换为任务,然后这些任务对拆分进行操作或处理。Presto 任务具有输入和输出,就像一个阶段可以由一系列任务并行执行一样,一个任务也可以由一系列驱动程序并行执行。

拆分

任务对拆分进行操作,拆分是更大数据集的部分。分布式查询计划中最低级别的阶段通过连接器从拆分中检索数据,而分布式查询计划中较高级别的中间阶段从其他阶段检索数据。

当 Presto 正在调度查询时,协调器将查询连接器以获取表的所有可用拆分的列表。协调器会跟踪哪些机器正在运行哪些任务以及哪些拆分正在由哪些任务处理。

驱动程序

任务包含一个或多个并行驱动程序。驱动程序对数据进行操作并组合运算符以生成输出,然后由任务进行聚合并传递到另一个阶段的另一个任务。驱动程序是运算符实例的序列。您可以将驱动程序视为内存中的一组物理运算符。它是 Presto 架构中最低级别的并行性。驱动程序有一个输入和一个输出。

运算符

运算符消耗、转换和生成数据。例如,表扫描从连接器获取数据并生成可以被其他运算符消耗的数据,而筛选器运算符消耗数据并通过对输入数据应用谓词来生成子集。

交换

交换在不同阶段的 Presto 节点之间传输数据。任务将数据写入输出缓冲区,并使用交换客户端从其他任务消耗数据。