文章目录
trino官网 https://trino.io/docs/407/client/cli.html
请注意:《Trino:权威指南》和研究论文《Presto: SQL on Everything》可以提供关于Trino和正在使用的概念的进一步信息。
前言
flink文章暂且放一放(视需求决定是否在继续更新,因为现在工作中暂时没有用到flink,纯粹是业务时间搞,正好最近生活压力也比较大,暂时放一放),最近在搞trino(trino之前叫presto),欢迎大家一起交流。
Trino是一个分布式SQL查询引擎,用于查询分布在一个或多个异构数据源上的大型数据集。
Trino不是什么?
由于Trino被社区的许多成员称为数据库,因此从定义Trino不是什么开始是有意义的。不要误解Trino理解SQL的事实,因为它提供了标准数据库的特性。Trino不是通用关系数据库。它不是MySQL、PostgreSQL或Oracle等数据库的替代品。Trino不是为处理在线事务处理(OLTP)而设计的。对于许多其他为数据仓库或分析而设计和优化的数据库也是如此。
Trino是什么?
trino是被用来设计大数据量异构查询的工具,如果你的数据量级是TGB或者PGB,你很容易会使用hadoop进行交互式查询。trino被设计为使用mapreduce作业管道(如hive和pig)查询hdfs的工具的替代方案,但trino并不仅限于HDFS。trino已经可以扩展到其它数据源介质进行操作,包括传统的关系型数据库(mysql,pg等)和其它数据源(比如Cassandra)。
trino被设计的目的是处理数据仓库且对其进行分析:数据分析,大数据量聚合和产出报告。这些工作负载通常被归类为在线分析处理(OLAP)。
概览
为了理解trino,你必须首先通过trino的doc文档理解它的条款以及概念。虽然理解语句和查询很容易,
- 作为最终用户,您应该熟悉stages和splits等概念,以便充分利用Trino执行有效的查询;
- 作为Trino管理员或贡献者,您应该了解Trino的阶段概念如何映射到任务,以及任务如何包含一组处理数据的驱动程序。
服务类型
trino服务有两种类型:coordinators和workers。 下面来介绍一下两者的区别。
Coordinator
Trino的coordinator是负责解析语句、规划查询和管理Trino工作节点的服务器。它是Trino安装的“大脑”,也是客户端连接到其上提交语句以执行的节点。每个Trino集群安装都必须有一个Trino coordinator和一个或多个Trino worker。出于开发或测试的目的,可以配置Trino的单个实例来执行这两个角色。
coordinator跟踪每个worker上的活动,并协调查询的执行。coordinator创建一个涉及一系列阶段的查询逻辑模型,然后将其转换为在Trino worker集群上运行的一系列连接任务。
coordinator使用REST API与worker和client通信。
worker
worker的server被安装是用来负责执行所有task和处理数据的。工作节点从连接器获取数据,并彼此交换中间数据。
当Trino worker进程启动时,它将自己发布到coordinator中的发现服务器,这使得Trino coordinator可以使用它执行任务。
worker使用REST API与其他worker和Trino coordinator通信。
数据源
在本文档中,您将阅读connector、catalog、schema和table等术语。这些基本概念涵盖了Trino的特定数据源模型,并将在下一节中进行描述。
connector
连接器会将trino适配到数据源,比如数据源hive或者一些关系型数据库。你可以像看待数据库驱动程序一样看待连接器。它是trino spi的实现,它允许trino使用标准api与资源进行交互。
Trino包含几个内置连接器:JMX连接器、System连接器(提供对内置系统表的访问)、Hive连接器和TPCH连接器(用于提供TPC-H基准测试数据)。许多第三方开发人员提供了连接器,这样Trino就可以访问各种数据源中的数据。
每个catalog都与特定的连接器相关联。如果您检查一个catalog配置文件,您将看到每个catalog都包含一个强制性属性connector.name,catalog管理器使用该属性为给定的catalog创建connector。可以让多个catalog使用相同的connector访问相似数据库的两个不同实例。例如,如果您有两个Hive集群,您可以在一个Trino集群中配置两个catalog,它们都使用Hive 连接器,允许您查询来自两个Hive集群的数据,甚至在同一个SQL查询中。
catalog
Trino catalog包含schema,并通过连接器引用数据源。例如,您可以配置一个JMX catalog,以通过JMX连接器提供对JMX信息的访问。当您在Trino中运行SQL语句时,您是针对一个或多个catalog运行它们。其他示例包括连接到Hive数据源的Hive编目。
在Trino中寻址表时,完全限定表名始终植根于catalog中。例如,hive.test_data.test的全限定表名。Test指的是hive目录中的test_data模式中的test测试表。
目录定义在存储在Trino配置catalog中的属性文件中。
schema
schema是一种组织表的方法。一起定义了一组可以查询的表。当使用Trino访问Hive或关系数据库(如MySQL)时,schema在目标数据库中转换为相同的概念。其他类型的连接器可能选择以对底层数据源有意义的方式将表组织到schema中。
table
表是一组无序行的集合,它们被组织成具有类型的命名列。这与任何关系数据库中的情况相同。从源数据到表的映射由连接器定义。
查询执行模型
Trino执行SQL语句,并将这些语句转换为查询,这些查询在coordinator和worker的分布式集群上执行。
Statement
Trino执行ansi兼容的SQL语句。当Trino文档引用语句时,它引用的是ANSI SQL标准中定义的语句,该标准由子句、表达式和谓词组成。
有些读者可能会好奇为什么本节分别列出语句和查询的概念。这是必要的,因为在Trino中,语句只是引用用SQL编写的语句的文本表示。当一个语句被执行时,Trino会创建一个查询和一个查询计划,然后在一系列Trino worker中分布。
Query
当Trino解析一条语句时,它将其转换为一个查询并创建一个分布式查询计划,然后将其实现为运行在Trino worker上的一系列相互连接的stage。当您在Trino中检索关于查询的信息时,您将收到每个组件的快照,这些组件涉及生成响应语句的结果集。
语句和查询之间的区别很简单。一条语句可以被认为是传递给Trino的SQL文本,而查询则是指为执行该语句而实例化的配置和组件。查询包括stages、tasks、splits、connector以及协同工作以产生结果的其他组件和数据源。
Stage
当Trino执行查询时,它通过将执行分解为阶段层次结构来执行。例如,如果Trino需要聚合Hive中存储的十亿行的数据,它会通过创建一个根stage来聚合其他几个阶段的输出,所有这些阶段都是为实现分布式查询计划的不同部分而设计的。
组成查询的stages层次结构类似于树。每个查询都有一个根stage,负责聚合来自其他阶段的输出。stage是coordinator用来建模分布式查询计划的工具,但是stage本身并不在Trino worker上运行。
Task
正如前一节所提到的,stage为分布式查询计划的特定部分建模,但是stage本身并不在Trino worker上执行。要理解stage是如何执行的,您需要理解stage是作为分布在Trino worker网络上的一系列任务实现的。
tasks是Trino体系结构中的“工作马”,因为分布式查询计划被分解为一系列阶段(stages),然后这些阶段被转换为任务,然后这些任务作用于或处理分割。Trino任务有输入和输出,就像一个阶段(stage)可以由一系列任务并行执行一样,一个任务也可以与一系列驱动程序并行执行。
Split
任务在分割上操作,分割是较大数据集的部分。分布式查询计划的最低级别的阶段通过连接器的分割检索数据,分布式查询计划较高级别的中间阶段从其他阶段检索数据。
当Trino调度查询时,coordinator会向连接器查询一个表中可用的所有分割列表。协调器跟踪哪些机器正在运行哪些任务,以及哪些任务正在处理哪些分割。
Driver
任务包含一个或多个并行驱动程序。驱动程序作用于数据并结合算子以产生输出,然后由一个任务聚合,然后交付给另一个阶段的另一个任务。驱动程序是操作符实例的序列,或者您可以将驱动程序看作内存中的操作符物理集。它是Trino体系结构中并行度的最低级别。驱动程序有一个输入和一个输出。
Operator
操作符消费、转换和生成数据。例如,表扫描从连接器获取数据并生成可被其他操作符使用的数据,筛选操作符使用数据并通过对输入数据应用谓词来生成子集。
Exchange
对于查询的不同阶段,交换在Trino节点之间传输数据。任务将数据生成到输出缓冲区,并使用交换客户机使用来自其他任务的数据。