认识Trino
- 一、Trino
- 二、结构
- 三、集群
- 四、coordinator
- 五、Worker
- 六、数据源
- 七、连接器
- 八、目录
- 九、架构
- 十、表
- 十一、查询执行模型
- 十二、陈述
- 十三、查询
- 十四、阶段
- 十五、任务
- 十六、分隔
- 十七、Driver
- 十八、Operator
- 十九、Exchange
一、Trino
- Trino(前身为PrestoSQL)是一个开源的分布式SQL查询引擎。它设计用于在大规模数据集上进行高性能、高并发的查询操作。
- Trino具有灵活性和快速响应性,并支持许多数据存储系统,如Hadoop HDFS、Amazon S3、MySQL、PostgreSQL等。
- 它提供了类似于传统SQL数据库的查询语言,可以从各种数据源中进行联机分析处理。
- Trino具有分布式架构,允许在集群中并行执行查询操作,并自动进行查询优化以提高查询性能。由于其强大的查询功能和扩展性,Trino被广泛应用于大型数据分析和商业智能领域。
二、结构
Trino 是一个分布式查询引擎,可以跨多个服务器并行处理数据。 Trino 服务器有两种类型:协调器和工作器。以下部分描述了这些服务器和 Trino 架构的其他组件。
三、集群
Trino 集群由一个协调器和许多工作器组成。用户使用 SQL 查询工具连接到协调器。协调员与工人合作。协调员和工作人员访问连接的数据源。此访问权限是在目录中配置的。
处理每个查询是一个有状态操作。工作负载由协调器编排并并行分布在集群中的所有工作线程中。每个节点在一个 JVM 实例中运行 Trino,并使用线程进一步并行处理。
四、coordinator
- Trino协调器是负责解析语句、规划查询和管理Trino工作节点的服务器。它是 Trino 安装的“大脑”,也是客户端连接以提交执行语句的节点。每个 Trino 安装都必须有一名 Trino coordinator和一名或多名 Trino Worker。出于开发或测试目的,可以将 Trino 的单个实例配置为执行这两个角色。
- coordinator跟踪每个工作人员的活动并协调查询的执行。协调器创建涉及一系列阶段的查询的逻辑模型,然后将其转换为在 Trino 工作集群上运行的一系列连接任务。
- coordinator使用 REST API 与工作人员和客户端进行通信。
五、Worker
- Trino Worker 是 Trino 安装中的服务器,负责执行任务和处理数据。工作节点从连接器获取数据并相互交换中间数据。协调员负责从工作人员那里获取结果并将最终结果返回给客户端。
- 当 Trino 工作进程启动时,它会将自己通告给coordinator中的发现服务器,这使得 Trino 协调器可以使用它来执行任务。
- Worker使用 REST API 与其他Worker和 Trino coordinator进行通信。
六、数据源
- 在整个文档中,您将阅读连接器、目录、架构和表等术语。这些基本概念涵盖了特定数据源的 Trino 模型,并将在下一节中进行描述。
七、连接器
- 连接器使 Trino 适应 Hive 或关系数据库等数据源。您可以像考虑数据库驱动程序一样来考虑连接器。它是 Trino SPI 的实现,允许 Trino 使用标准 API 与资源交互。
- Trino 包含多个内置连接器:一个用于 JMX 的连接器、一个提供对内置系统表的访问的系统连接器、一个 Hive 连接器以及一个旨在提供 TPC-H 基准数据的 TPCH 连接器。许多第三方开发人员贡献了连接器,以便 Trino 可以访问各种数据源中的数据。
- 每个目录都与特定的连接器相关联。如果您检查目录配置文件,您会发现每个配置文件都包含一个强制属性connector.name,目录管理器使用该属性为给定目录创建连接器。可以让多个目录使用相同的连接器来访问相似数据库的两个不同实例。例如,如果您有两个 Hive 集群,则可以在单个 Trino 集群中配置两个目录,这两个目录都使用 Hive 连接器,从而允许您从两个 Hive 集群查询数据,甚至在同一个 SQL 查询中也是如此。
八、目录
- Trino 目录包含模式并通过连接器引用数据源。例如,您可以配置 JMX 目录以通过 JMX 连接器提供对 JMX 信息的访问。当您在 Trino 中运行 SQL 语句时,您是针对一个或多个目录运行它们。目录的其他示例包括用于连接到 Hive 数据源的 Hive 目录。
- 在 Trino 中寻址表时,完全限定的表名称始终植根于目录中。例如,完全限定的表名称 hive.test_data.test 指的是 hive 目录中 test_data 模式中的测试表。
- 目录在 Trino 配置目录中存储的属性文件中定义。
九、架构
- 模式是一种组织表格的方法。目录和模式一起定义了一组可以查询的表。当使用 Trino 访问 Hive 或 MySQL 等关系数据库时,模式会转换为目标数据库中的相同概念。其他类型的连接器可能会选择以对底层数据源有意义的方式将表组织到架构中。
十、表
- 表是一组无序的行,它们被组织成具有类型的命名列。这与任何关系数据库中的情况相同。从源数据到表的映射由连接器定义。
十一、查询执行模型
Trino 执行 SQL 语句并将这些语句转换为查询,这些查询在coordinator和worker的分布式集群上执行。
十二、陈述
- Trino 执行 ANSI 兼容的 SQL 语句。当 Trino 文档引用语句时,它指的是 ANSI SQL 标准中定义的语句,它由子句、表达式和谓词组成。
- 有些读者可能会好奇为什么本节列出了语句和查询的单独概念。这是必要的,因为在 Trino 中,语句仅指用 SQL 编写的语句的文本表示。执行语句时,Trino 会创建一个查询以及一个查询计划,然后将其分发到一系列 Trino 工作线程中。
十三、查询
- 当 Trino 解析语句时,它将其转换为查询并创建分布式查询计划,然后将其实现为在 Trino Worker 上运行的一系列互连阶段。当您在 Trino 中检索有关查询的信息时,您会收到参与生成响应语句的结果集的每个组件的快照。
- 语句和查询之间的区别很简单。语句可以被认为是传递给 Trino 的 SQL 文本,而查询是指为执行该语句而实例化的配置和组件。查询包含阶段、任务、拆分、连接器以及协同工作以产生结果的其他组件和数据源。
十四、阶段
- 当 Trino 执行查询时,它通过将执行分解为阶段层次结构来实现。例如,如果 Trino 需要聚合 Hive 中存储的 10 亿行数据,它会通过创建一个根阶段来聚合其他几个阶段的输出来实现这一目的,所有这些阶段都旨在实现分布式查询计划的不同部分。
- 组成查询的阶段层次结构类似于树。每个查询都有一个根阶段,它负责聚合其他阶段的输出。协调器使用阶段来建模分布式查询计划,但阶段本身并不在 Trino 工作线程上运行。
十五、任务
- 正如上一节中提到的,阶段对分布式查询计划的特定部分进行建模,但阶段本身并不在 Trino 工作线程上执行。要了解阶段是如何执行的,您需要了解阶段是作为分布在 Trino 工作人员网络上的一系列任务来实现的。
- 任务是 Trino 架构中的“主力”,因为分布式查询计划被解构为一系列阶段,然后将其转换为任务,然后任务执行或处理拆分。 Trino 任务具有输入和输出,正如一个阶段可以由一系列任务并行执行一样,任务也可以与一系列驱动程序并行执行。
十六、分隔
- 任务对分割进行操作,分割是较大数据集的一部分。分布式查询计划最低级别的阶段通过连接器的拆分检索数据,分布式查询计划较高级别的中间阶段从其他阶段检索数据。
- 当 Trino 调度查询时,协调器会向连接器查询可用于表的所有拆分的列表。协调器跟踪哪些机器正在运行哪些任务,以及哪些任务正在处理哪些分片。
十七、Driver
- 任务包含一个或多个并行驱动程序。驱动程序对数据进行操作并组合运算符以生成输出,然后由任务聚合该输出,然后将其传递给另一个阶段的另一个任务。驱动程序是一系列运算符实例,或者您可以将驱动程序视为内存中的一组物理运算符。它是 Trino 架构中最低级别的并行性。驱动器有一个输入和一个输出。
十八、Operator
- 操作员消费、转换和生成数据。例如,表扫描从连接器获取数据并生成可由其他运算符使用的数据,而过滤运算符使用数据并通过对输入数据应用谓词来生成子集。
十九、Exchange
- Exchange 在 Trino 节点之间传输数据以进行查询的不同阶段。任务将数据生成到输出缓冲区中,并使用交换客户端消耗来自其他任务的数据。