【Trino权威指南(第二版)】Trino的架构、trino架构组件、 trino连接器架构的细节、trino的查询执行模型

文章目录

  • 一. Trino架构
    • 1. 架构概览
    • 2. 协调器
    • 3. 发现服务
    • 4. 工作节点
  • 二. 基于连接器的架构
  • 三. 查询执行模型
    • 1. 解析—>查询计划
    • 2. 查询计划 —> 分布式查询计划
    • 3. 运行阶段
      • 3.1. 基础概念
        • 切片:并行单元
        • page 与 exchange算子
        • pipeline
        • 切片的driver
        • Operator
      • 3.2. running 概述

本文主要讨论了

  • Trino的架构,它使用一个协调器来接收用户请求,之后调用工作节点来组装来自数据源的全部数据。
  • trino架构组件:协调者、worker、发现服务
  • trino连接器架构的细节:连接器功能内容、通过catalog来配置连接数据源的不同行为,协调者、worker使用不同的连接器接口
  • trino的查询执行模型
    每个查询都被翻译成分布式查询计划,该查询计划由多个stage中的任务构成。
  • 数据以切片形式由连接器返回,并在多个stage中处理,直到最终结果可用并由协调器提供给用户。

一. Trino架构

1. 架构概览

Trino是一个分布式SQL查询引擎,大规模并行处理(Massively Parallel Processing,MPP)的数据库和查询引擎。Trino通过在整个集群的服务器上分配处理任务来实现横向扩展,而非通过提高单台服务器的性能来进行垂直扩展

基于这种架构,Trino查询引擎在集群内的计算节点上可以并行处理海量数据上的SQL查询。在每个计算节点上,Trino都以单个服务器进程的形式运行。一个Trino集群由多个被配置为相互协作的Trino节点组成。
 

集群架构

A Trino cluster consists of a coordinator and many workers. Users connect to the coordinator with their SQL query tool. The coordinator collaborates with the workers. The coordinator and the workers access
the connected data sources. This access is configured in catalogs.
 
Processing each query is a stateful operation. The workload is orchestrated by the coordinator and spread parallel across all workers in the cluster. Each node runs Trino in one JVM instance, and
processing is parallelized further using threads.

trino架构由(至少)一个协调者和多个worker组成,用户通过SQL工具与coordinator连接。coordinator管理workers。通过配置catalogs,coordinator 和 the workers访问已连接的数据源。

每个查询的执行都是状态操作,coordinator编排工作负载,它会将任务调度到workers中并行执行。每个trino都运行在JVM实例中,并通过使用线程 进一步将任务并行化。

 

在这里插入图片描述

  • 用户使用客户端工具(如JDBC驱动或Trino CLI)连接到集群中的协调器。之后,协调器就可以协调工作节点访问数据源。

  • 协调器是一类处理用户查询请求并管理工作节点执行查询工作的服务器。工作节点是一类负责执行任务和处理数据的服务器。

  • 协调器通常会运行一个节点发现服务,工作节点通过注册到该服务来加入集群。客户端、协调器和工作节点之间所有的通信和数据传输,都通过基于HTTP/HTTPS的REST服务交互(为什么不是rpc服务)。

 

通讯逻辑
在这里插入图片描述
协调器与工作节点通信来分配任务、更新状态,并从工作节点获取顶层(?)的结果集来返回给用户。工作节点从运行在其他工作节点上的上游任务中获取数据,并从数据源获取结果集。

 

2. 协调器

Trino协调器负责接收用户SQL查询、解析查询语句、规划查询执行 并 管理工作节点

接收用户查询

协调器是Trino集群的大脑,客户端程序都会连接它。
用户可以通过Trino CLI来与协调器交互,而应用程序可以使用JDBC或ODBC驱动、Python客户端或其他语言下可用的客户端库来交互。

 

管理工作节点
协调器跟踪每个工作节点的活动并协调查询的执行。协调器创建一个包含一系列Stage的逻辑模型

 
sql执行的底层逻辑

  • 在协调器接收到一条SQL语句后,它负责对该SQL解析、分析、创建执行计划,并在工作节点上调度执行查询任务。
  • 查询语句被翻译成一系列互相连接的任务,这些任务被分发到集群的工作节点上运行
  • 在工作节点处理数据的同时,协调节点会获取执行结果并放入输出缓冲区,并对客户端暴露该缓冲区中的数据。在客户端读完输出缓冲区的数据后,协调节点会代表客户端从工作节点获取更多的数据(结果集是一部分一部分读)。而工作节点轮流与 数据源(?) 交互并从中读取数据。通过以上流程,在查询执行结束以前,客户端不断地请求数据,工作节点则不断地从数据源读取数据并提供给客户端。
    在这里插入图片描述
    协调器、工作节点和客户端基于HTTP协议进行通信。如图展示了客户端、协调器和工作节点之间的通信情况。

在开发和测试的场景下,单个Trino实例可以作为协调器和工作节点两种角色进行工作。

 

3. 发现服务

节点发现基本逻辑

Trino使用发现服务来发现集群中的所有节点。每个Trino实例在启动时都会注册到发现服务,并定期向该服务发送心跳信号。通过这种方式,协调器能够维护一个可用工作节点的最新列表,并用它来调度查询的执行
 
如果工作节点向发现服务发送心跳消息失败,发现服务就会启动错误探测器(failure
detector),此后该工作节点不会再参与执行新的任务。

 

通过HTTP进行发现

发现服务运行在Trino协调器中,它与Trino协调器共享一个HTTP服务端,使用同一个端口。因此,工作节点配置的发现服务指向协调器的主机名和端口。

 

4. 工作节点

工作节点负责执行协调器分配的任务,包括从数据源获取数据并处理数据

具体工作

工作节点使用连接器从数据源获取数据,工作节点之间也会交换中间数据,然后它发送最终结果数据给协调器。由协调器负责收集来自各个工作节点的结果并发送给客户端。

 

向协调器注册自己

在安装集群时,工作节点需要知道集群的发现服务所在的主机名或IP地址。工作节点启动时,会将自己注册到发现服务上,以便协调器可以向其分配任务来执行。

 
与其他节点通讯

工作节点使用HTTP协议与其他工作节点和协调器通信。

如图展示了多个工作节点如何从数据源检索并协作处理数据,直到其中 (只有一个?)一个工作节点 可以向协调器提供结果。
在这里插入图片描述

 

二. 基于连接器的架构

Trino存储与计算分离的核心是基于连接器的架构。连接器为Trino提供了连接任意数据源的接口

trino连接器基础
每个连接器在底层数据源上提供了一个基于表的抽象。只要数据能用Trino支持的数据类型表示成表、列和行,Trino就可以创建连接器并让查询引擎使用这些数据进行查询处理。

通过在连接器中实现SPI,Trino就可以在内部使用标准操作来连接到任意数据源,并在该数据源上执行操作。连接器负责处理与特定数据源相关的细节。

每个连接器实现API的三个部分:

  • 获取表、视图、schema的元数据的操作。
  • 产生 数据分区(mysql也能并行读写?) 的逻辑单元的操作,用于Trino的并行读写。
  • 数据源和接收器模块,需要与查询引擎使用的内存数据格式进行转换

 
连接器让trino引擎忽略与数据源交互细节

在Trino中,支持从底层数据源读数据的连接器都需要实现listTables的SPI。因此,Trino可以使用相同的方法来让任何连接器检查schema中可用表的列表。

Trino不需要知道连接器实现的细节,一些连接器从information schema中获取数据,其他连接器需要查询元存储(metastore),还有一些通过请求数据源的API来获取信息。Trino引擎的核心会忽略这些细节,而由连接器来处理实现

这种方式把查询引擎核心关心的内容与底层具体数据源提供的细节清晰地分开。这种方式看似简单,但很有意义,因为它在可读性、可扩展性和代码维护性上能提供很大的好处。

 

自定义连接器

Trino的SPI还让你能够创建自定义连接器,这在你需要连接到一个尚未支持连接器的数据源时非常有用。如果你最终要创建新连接器,强烈建议你了解下Trino的开源社区,寻求我们的帮助并将你的连接器贡献出来。如果组织内有独特的或专有的数据源,可能也需要自定义连接器。这就是Trino允许用户使用SQL查询任何数据源的原因——真正的SQL-on-Anything。

 
协调器与worker使用不同的spi接口

Trino SPI包含的不同接口,其中协调器使用的是元数据、数据统计和数据位置接口,工作节点使用的是数据流接口。
在这里插入图片描述
 

连接器配置与加载

连接器通过配置catalog文件来指定不同数据源特定的参数。Trino在启动时,扫描catalog目录以插件的形式加载连接器。

每个catalog都会配置一个连接器来访问特定的数据源。数据源在catalog中暴露出一个或多个schema(可以理解为数据库)。每个schema包含表,表提供数据行,每个数据行由一些具有不同数据类型的列组成。
 

插件思想

Trino的很多功能使用了基于插件的架构。除了连接器,插件也可以实现事件监听器、访问控制、函数和数据类型。

 

三. 查询执行模型

接下来将探讨Trino如何实际处理SQL查询语句。

理解执行模型是在Trino中进行查询性能调优必备的基础知识。

sql在trino架构的执行过程

终端用户通过CLI,使用ODBC或JDBC客户端,或使用其他客户端库来发送SQL语句到协调器。协调器之后调用工作节点从数据源获得数据、创建结果数据集并将结果返回给客户端。

 

1. 解析—>查询计划

首先,SQL语句以文本形式提交到协调器,协调器解析和分析SQL语句。之后,Trino创建一个由内部数据结构表示的执行计划,叫作查询计划,如下图。
在这里插入图片描述
查询计划全面地表示了对每条SQL语句处理数据和返回结果所需进行的步骤。

使用SPI连接到数据源

查询计划生成过程使用元数据SPI和数据统计SPI来创建查询计划。也就是说,协调器会 使用SPI直接连接到数据源来收集有关表和其他元数据的信息。 这些信息用于对查询进行语义校验、表达式类型检查和安全检查。
 
在这里插入图片描述

统计SPI\数据位置SPI

  • 统计SPI用于获取行数和表大小的信息,从而在计划期间进行基于代价的查询优化
  • 数据位置SPI在创建分布式查询计划时会被用来生成表内容的逻辑切片。切片(具体切片的逻辑)是任务分配和并行的最小单位。

 

2. 查询计划 —> 分布式查询计划

分布式查询计划是查询计划的一个扩展,它包含一个或多个阶段(stage)。查询计划被切分成多个计划片段(plan fragment)。stage是运行时的plan fragment,包含计划片段所描述的所有任务。?

在这里插入图片描述

协调器将查询计划切分成stage,分配给集群中的多个工作节点并行处理,从而加快整体查询的执行速度。(一个job中所有的)stage会被创建为成一棵stage依赖树。

stage的数量依赖于查询的复杂度。例如,查询的表、返回的列、JOIN语句、WHERE条件、GROUP BY操作和其他SQL语句都会影响stage的数量。

 
分布式执行
通过分布式执行计划,协调器在工作节点上进一步计划和调度任务。一个stage通常包含一个或多个任务,每个任务则负责处理一小部分数据。 如下图:协调器将一个stage的任务分配给集群中的工作节点。

在这里插入图片描述

 

3. 运行阶段

3.1. 基础概念

切片:并行单元

一个任务处理数据的单位是切片。切片代表一个工作节点可以提取并处理的一段底层数据,它是并行和任务分配的基本单元。

并发信息:形成切片列表的元数据
连接器执行的特定数据操作依赖于底层的数据源。例如,Hive连接器用带有文件路径、读取偏移量和读取长度的文件信息来描述切片信息,这些信息标明了该文件需要处理的区域。

 

page 与 exchange算子

page
源stage的任务以页(page)的形式生产数据。其中,page是以列格式存储的一系列行,它们被传输到其他中间下游stage。exchange算子从上游stage的任务中读取数据,从而在不同(节点)stage之间传输page。

page的传递

在连接器的帮助下,源任务使用数据源SPI从底层数据源获取数据。Trino以page的形式表示这些数据,并在查询引擎中传送数据。算子根据自身的语义处理(接收到的page)和 产生新的page。
例如,filter算子会丢弃过滤掉的行,projection算子生成(起源于原始列的)新列的page等。

 

pipeline

包含在一个任务里的一连串算子(operator)叫作流水线(pipeline)。一条流水线中的最后一个算子通常会将它输出的page 放置在任务的输出缓冲区中。下游任务的exchange算子会从上游任务的输出缓冲区中消费page

如下图,所有这些操作都在不同的工作节点上并行执行。
在这里插入图片描述
 

切片的driver

在任务被创建之后,它会为每个切片初始化一个driver。每个driver都是包含多个算子的流水线的一个实例,并且负责处理切片中的数据。
在这里插入图片描述

如上图,根据Trino的配置和环境,一个任务可以使用一个或多个driver。一旦所有driver都执行完并且数据被传送到下一个切片,driver和任务的工作就结束了,之后(任务还没结束?)会被销毁。

 

Operator

常见的算子包括table scan(表扫描)、filter(过滤)、join(连接)和aggregate(聚合)。一系列算子组成一条pipline。例如,你可以拥有这样一条pipline,它先扫描并读入数据,再过滤数据,最后在数据上执行局部聚合。

 

3.2. running 概述

要处理一条查询,协调器首先根据来自连接器的元数据创建切片列表(ing源码逻辑)。使用该切片列表,协调器开始在工作节点上调度任务,以获取切片中的数据。在查询执行期间,协调器跟踪所有可被处理的切片,以及在工作节点上运行并处理切片的任务的位置。

随着任务结束处理,它会产生更多供下游处理的切片。协调器会不断地调度任务来处理这些新的切片,直到没有需要处理的切片为止。一旦工作节点处理完所有切片,全部数据就都可用,协调器用这些数据产生结果,客户端可以获取该结果。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/247458.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python高级算法——线性规划(Linear Programming)

Python中的线性规划(Linear Programming):高级算法解析 线性规划是一种数学优化方法,用于求解线性目标函数在线性约束条件下的最优解。它在运筹学、经济学、工程等领域得到广泛应用。本文将深入讲解Python中的线性规划&#xff0…

连续型随机变量的概率密度

如果对于随机变量的分布函数,存在非负可积函数,使得对于任意实数,有: 那么就称为连续型随机变量,称为的概率密度函数,简称密度函数。

微信小程序合集更更更之实现雪花随机飘落

实现效果 写在最后🍒 更多相关内容,关注🍥苏苏的bug,🍡苏苏的github,🍪苏苏的码云~

为MES实施建立成功的团队:应对挑战并确保成功

前言 实施MES是一个复杂且具有挑战性的过程,需要协调良好的团队共同努力。 为了取得成功,建立一支具有专业技能、专业知识和共同愿景的团队组合成为致胜的关键。本文将探讨组建MES团队的关键要素,例如: 确定关键利益相关者和决策…

产品经理之Axure的元件库使用详细案例

⭐⭐ 产品经理专栏:产品专栏 ⭐⭐ 个人主页:个人主页 ​ 目录 前言 一.Axure的元件库的使用 1.1 元件介绍 1.2 基本元件的使用 1.2.1 矩形、按钮、标题的使用 1.2.2 图片及热区的使用 1.3 表单元件及表格元件的使用 1.3.1表单元件的使用 1.3.…

VSCode解决本地浏览器需要跨域问题

这里写目录标题 测试用代码执行代码后控制台报错现象解决方案 测试用代码 先把测试用的代码贴出来 测试代码结构 index.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Com…

基于CNN+数据增强+残差网络Resnet50的少样本高准确度猫咪种类识别—深度学习算法应用(含全部工程源码)+数据集+模型(四)

系列文章目录 基于CNN数据增强残差网络Resnet50的少样本高准确度猫咪种类识别—深度学习算法应用(含全部工程源码)数据集模型&#xff08;一&#xff09; 基于CNN数据增强残差网络Resnet50的少样本高准确度猫咪种类识别—深度学习算法应用(含全部工程源码)数据集模型&#xf…

飞天使-docker知识点8-docker的资源限制

文章目录 容器资源限制示例 容器资源限制 Docker提供了多种资源限制的方式&#xff0c;可以根据应用程序的需求和系统资源的可用性进行选择。以下是一些常见的Docker资源限制及其使用情况&#xff1a;CPU限制&#xff1a;通过设置CPU的配额&#xff08;quota&#xff09;和周期…

YOLOv8-Seg改进:UniRepLKNetBlock 助力分割 | UniRepLKNet,通用感知大内核卷积网络, 2023.12

🚀🚀🚀本文改进: UniRepLKNet,通用感知大内核卷积网络,ImageNet-22K预训练,精度 和速度SOTA,ImageNet达到88%, COCO达到56.4 box AP,ADE20K达到55.6 mIoU UniRepLKNetBlock 与C2f进行结合使用 🚀🚀🚀YOLOv8-seg创新专栏:http://t.csdnimg.cn/KLSdv 学姐带…

安装NLTK Data

文章目录 NLTK离线安装1. 获取安装包2. 放置nltk_data文件3. Demo4. 参考链接 关注公众号&#xff1a;『AI学习星球』 算法学习、4对1辅导、论文辅导或核心期刊可以通过公众号或CSDN滴滴我 nltk库是python语言为自然语言处理提供的一个功能强大&#xff0c;简单易用的函数库&a…

AUTOSAR组织引入了Rust语言的原因是什么?有哪些好处?与C++相比它有什么优点?并推荐一些入门学习Rust语言链接等

AUTOSAR(汽车开放系统架构)是一个由汽车制造商、供应商和其他来自电子、半导体和软件行业的公司组成的全球发展伙伴关系,自2003年以来一直致力于为汽车行业开发和引入开放、标准化的软件平台。 AUTOSAR 最近宣布成立一个新的工作组,用于探索在汽车软件中使用 Rust 编程语言…

python初试二

连接数据库 Django为多种数据库后台提供了统一的调用API。根据需求不同&#xff0c;Django可以选择不同的数据库后台。MySQL算是最常用的数据库。我们这里将Django和MySQL连接。 在Linux终端下启动mysql: $mysql -u root -p 在MySQL中创立Django项目的数据库&#xff1a; …

Python—KNN分类算法

原文: https://zhuanlan.zhihu.com/p/143092725 1. 概述 KNN 可以说是最简单的分类算法之一&#xff0c;同时&#xff0c;它也是最常用的分类算法之一。注意&#xff1a;KNN 算法是有监督学习中的分类算法&#xff0c;它看起来和另一个机器学习算法 K-means 有点像&#xff0…

山峰个数 - 华为OD统一考试

OD统一考试 分值: 100分 题解: Java / Python / C++ 题目描述 给定一个数组,数组中的每个元素代表该位置的海拔高度。0表示平地,>=1时表示属于某个山峰,山峰的定义为当某个位置的左右海拔均小于自己的海拔时,该位置为山峰。数组起始位置计算时可只满足一边的条件。 …

【Hive】——CLI客户端(bin/beeline,bin/hive)

1 HiveServer、HiveServer2 2 bin/hive 、bin/beeline 区别 3 bin/hive 客户端 hive-site.xml 配置远程 MateStore 地址 XML <?xml version"1.0" encoding"UTF-8" standalone"no"?> <?xml-stylesheet type"text/xsl" hre…

基于OHTPPS实现网站HTTPS访问

前言 笔者近期为网站配置HTTPS的域名&#xff0c;查找了大量方案&#xff0c;最近寻得一个不错的解决方式&#xff0c;通过OHTTPS获取免费的证书并部署到阿里云服务器上。 步骤 到OHTTPS官网注册账号 官方地址如下&#xff0c;读者可以先行到官网注册一下账号&#xff0c;笔…

学生管理系统 数据库版

1.写SQL语句 创建school_java数据库 创建student数据表包含 id、name姓名、tel电话、sex性别字段 往student表中加10条数据 2.写Java代码&#xff08;要求只用PreparedStatement对象&#xff0c;变化的值都用?代替&#xff09; 查询student表中所有学生信息 student表中新增三…

Android多国语言翻译 国际化

语言目录详细对应关系 Arabic, Egypt (ar-rEG) —————————–阿拉伯语&#xff0c;埃及 Arabic, Israel (ar-rIL) ——————————-阿拉伯语&#xff0c;以色列 Bulgarian, Bulgaria (bg-rBG) ———————保加利亚语&#xff0c;保加利亚 Catalan, Spain (ca-r…

解决移动端小程序事件穿透的问题

知识点&#xff1a;pointer-events 属性在移动端开发中经常用于处理事件的穿透和响应控制。 下面是对应的场景&#xff1a; 在地图上面写多个小图标&#xff0c;图标位于地图两侧并且都可以点击。要求点击图标时不触发地图的点击事件。如图&#xff1a; 相关代码如下&#xf…

C#串口通讯

在C#写串口通讯小程序时&#xff0c;可以使用System.IO.Ports命名空间提供的SerialPort类。下面是一个简单的例子&#xff0c;包含了一个基本的UI&#xff0c;用于设置串口参数和进行通讯。这里使用了Windows Forms&#xff08;WinForms&#xff09;来创建UI。 步骤&#xff1…