一、概述
(前身为)是一款高性能,分布式的SQL查询引擎,可以用于查询各种类型的数据存储,包括、、、、等。在使用Trino时,可以通过一些参数来控制查询的行为,例如:
节点和节点的数量: 这两个参数控制了Trino集群中管理查询的节点数量,它们的配合调整可以影响整个集群的查询效率。
和的分配: 这些参数控制了Trino在查询和计算时使用的内存和CPU数量。可以根据集群的实际硬件情况和查询工作负载来灵活配置。
分布式:控制join关键字的使用。join分布式是一种优化策略,在大规模数据集上运行的查询中处理join操作非常简单。
指定数据源:可以使用和两个关键字指定Trino查询的数据源。
分区和bucket表的查询: 分区表是对表进行分区和拆分的一种方式,通过分区表查询只需扫描相应分区,提高了查询效率。bucket表是一种将数据分散在多个桶中的表格,它们可以通过桶数对数据进行分片,并行化查询操作,从而提高查询性能。
Trino官方文档:https://trino.io/docs/current/
二、Trino coordinator 和 worker 节点作用
1)Trino coordinator 节点作用
在Trino中,coordinator节点是整个集群的管理节点,它的作用包括:
查询协调:coordinator节点负责协调所有查询操作,如解析sql语句、生成查询计划、调度和分配查询任务等。它会根据查询的复杂度和数据源的规模来判断查询是否需要被分割和并行执行,以提高查询效率和资源利用率。
资源管理:coordinator节点负责管理整个集群的资源,如内存、CPU等。它会根据每个查询的资源需求和集群的可用资源情况来动态调整资源使用情况,以保证集群的稳定性和性能。
节点管理:coordinator节点负责管理集群的所有worker节点,包括状态更新、任务分配、心跳检测等。它会监测节点的可用性和状态,并根据集群负载情况来动态调整节点的任务分配和负载平衡策略,以保证整个集群的稳定性和可用性。
集群监控:coordinator节点负责监控整个集群的运行状况,包括各个节点的状态、负载情况、查询性能等。它会将这些信息进行汇总和分析,并生成相应的报告和指标,以便管理员进行集群的优化和调整。
系统管理:coordinator节点负责管理整个Trino系统,包括配置文件管理、插件管理、安全管理等。它会根据管理员的设定和权限来进行相应的管理和控制,以保证整个系统的稳定性和安全性。
因此,可以看出coordinator节点在Trino集群中起到了至关重要的作用,它是整个集群的大脑和控制中心。为了保证集群的性能和可用性,建议对coordinator节点进行适当的配置和管理,以满足查询复杂度和数据量的需求。
2)Trino worker 节点作用
在Trino中,worker节点是集群中执行任务的节点。它的作用包括:
任务执行:worker节点负责执行coordinator分配给它的任务,如数据读取、数据过滤、数据聚合等。它会将数据处理的结果返回给coordinator节点,以便进行下一步的处理和计算。
数据存储:worker节点负责存储集群中的数据,包括数据的分片、存储和管理等。它会维护一个数据存储仓库,并根据查询计划和任务分配来读取和处理数据,以提高查询效率和资源利用率。
资源管理:worker节点会根据集群的资源限制和任务优先级,动态调整资源的分配和使用情况,以保证集群的稳定性和性能。
网络通信:worker节点负责与coordinator节点进行通信,并根据分配的任务来读取和处理数据。它需要保证和coordinator节点的通信畅通,并及时反馈处理结果。
因此,可以看出worker节点在Trino集群中扮演了至关重要的角色,它是整个集群的工作机器和数据存储仓库。为了保证集群的性能和可用性,建议对worker节点进行适当的配置和管理,以满足查询和数据处理的需求。同时,建议用户根据自己的业务需求和数据量来增加或降低worker节点的数量和配置,以达到最佳的资源利用率和查询效率。
三、Trino 参数详细讲解
1)coordinator 节点配置
1、config.properties 配置文件
config.properties是Trino服务器的配置文件,它包含了Trino服务器的各种配置选项,如节点配置、查询优化器配置、内存和CPU配置、集群安全配置等。下面是几个常见的选项:
:配置当前节点是否为coordinator节点。
:是Trino协调节点(coordinator)的配置参数之一,用于控制调度器是否包括协调节点自身作为可用的执行节点。默认情况下,的值为 ,即协调节点被视为可用的执行节点。
:该参数用于设置每个工作节点上单个任务(task)可使用的最大内存量。它定义了每个任务在工作节点上可以使用的最大内存量。单位可以是字节(B)、千字节(KB)、兆字节(MB)、千兆字节(GB)或太字节(TB)。
:这个参数设置了每个查询可使用的最大内存量。它控制着整个查询在所有工作节点上可以使用的总内存量。当查询需要的内存超过这个限制时,Trino将抛出内存不足的错误。
:此参数定义了每个工作节点可使用的最大内存量。它限制了单个查询在单个工作节点上可以使用的最大内存量。当单个任务需要的内存超过此限制时,Trino将启动其他任务以利用其他工作节点上的内存。
: 该参数限制了每个工作节点可使用的最大总内存量。它控制着所有正在运行的查询在单个工作节点上可以使用的总内存量。当工作节点上的查询总内存使用超过此限制时,Trino将拒绝新的查询请求。
:用来配置Trino worker节点的Java堆空间余量的选项。它指定了每个worker节点JVM堆中保留的额外内存空间的大小,用于处理临时内存和查询的内存需求。默认情况下,memory.heap-headroom-per-node的值是0。这意味着Trino使用默认的Java Heap内存分配策略来处理内存,并尽可能避免OOM(内存不足)错误。
:配置每个查询的最大运行时间,防止查询太复杂导致资源耗尽。
:配置http服务器的端口号。
:配置查询结果在内存中的最大保存时间,防止浪费内存。
:配置查询的优先级,以便coordinator节点调度任务。
:配置worker节点与coordinator节点之间数据交换的线程数量,以提高网络通信效率。
:配置插件选项和值,以扩展Trino的功能和支持新的数据源。
因此,config.properties文件对于Trino服务器的性能和功能都具有重要的作用,建议管理员和用户仔细查阅和配置。同时,可以根据业务需求和系统资源情况来适当调整其中的选项,以达到最佳的性能和效率。
示例配置如下:
2、jvm.config 配置文件
Trino协调节点(coordinator)的JVM配置文件是 。它位于Trino安装目录的 etc 文件夹中。
文件用于配置协调节点的Java虚拟机(JVM)参数,以控制内存、垃圾回收、线程等方面的行为。
一些常用的JVM参数及其含义:
:启用服务器模式,优化性能。
:设置Java堆的最大内存为8GB。最好是配置小于32G。
:启用G1垃圾收集器。
:是一个Java虚拟机(JVM)参数,用于设置初始堆内存的百分比。它指定了初始堆内存大小相对于可用系统内存的比例。默认值为,表示JVM将会使用可用系统内存的。
:是一个JVM参数,用于指定JVM使用系统内存的最大百分比。这个参数可以被用于Trino和其他Java应用程序。它的默认值为,表示JVM将最大使用可用系统内存的。例如,如果系统有16GB内存可用,则默认情况下JVM将使用10.24GB内存。
:是一个JVM参数,用于控制G1垃圾收集器中堆区域的大小。G1垃圾收集器是Java SE 9及更高版本中使用的一种高效的垃圾收集器,可以用于Trino和其他Java应用程序。堆区域是垃圾收集器中内存分配的最小单位。这个参数的默认值是堆大小除以,最小值是,最大值是32MB。这意味着如果堆大小是,则每个堆区域的默认大小是。
:是一个JVM参数,用于启用显式垃圾回收调用时并发处理的垃圾收集器。在此模式下,会在发出垃圾回收调用时,同时运行一个并发垃圾收集器,以优化程序的性能。
:是一个JVM参数,用于在发生错误时自动退出JVM。OutOfMemoryError指的是Java程序中无法分配足够的内存的情况。默认情况下,JVM在发生时不会终止。如果您使用这个参数,则JVM将在发生OutOfMemoryError时立即退出,从而防止程序继续运行并进一步损坏数据或系统。
:是一个JVM参数,用于在Java程序中启用错误堆栈跟踪提示。通常,当Java程序中发生异常或错误时,系统会生成一个堆栈跟踪提示来告诉您程序执行过程中出现了哪些错误。默认情况下,当程序中的代码中发生快速失败时,JVM会省略异常堆栈跟踪提示,以提高程序的性能。这意味着,当程序出现错误时,您可能无法轻松地DEBUG并查找到底发生了什么错误。
:是一个JVM参数,用于设置JIT编译器代码缓存的最大大小。默认情况下,JIT编译器会将编译过的代码存放在代码缓存中,以加速程序的后续执行。然而,如果缓存大小不够,JIT编译器可能会不得不丢弃部分编译过的代码,这会导致程序性能下降。
:是一个Java虚拟机(JVM)的参数,用于设置方法重新编译的阈值。它指定了一个方法在执行多少次之后需要重新编译。该参数的值通常是一个正整数,默认值为。
:是一个Java虚拟机(JVM)的参数,用于设置字节码重新编译的阈值。它指定了一个方法的字节码在执行多少次之后需要重新编译。该参数的值通常是一个正整数,默认值为。
是一个Java系统属性,用于允许Java进程自己附加到自己。该属性通常用于启用Java程序自我监视和调试的功能。默认情况下,此属性被设置为,禁止Java进程附加到自身。要允许Java进程附加到自身,需要将该属性设置为"true"。
:是一个Java系统属性,用于设置NIO缓冲区的最大缓存大小。NIO(New I/O)是Java提供的一种高性能I/O操作方式。该属性指定了NIO缓冲区在缓存中的最大大小。默认情况下,该属性未设置,使用JVM内部的默认值。可以通过设置该属性为一个正整数值来限制NIO缓冲区的最大缓存大小,以控制内存的使用。默认值取决于 Java 运行时环境的版本。在 ,默认值为 ,表示不限制NIO 缓冲区的最大缓存大小。而在 ,默认值为 ,表示禁用 NIO 缓冲区的缓存,即不进行缓存。
:是一个 Java 虚拟机(JVM)选项,用于解锁诊断性 VM 选项。默认情况下,JVM 中的某些诊断功能是被禁用的,通过使用该选项,可以解锁并启用这些诊断功能。这个选项通常用于开发和调试目的。
:是一个 Java 虚拟机(JVM)选项,用于启用加密算法的硬件优化。当该选项被启用时,JVM会尝试使用CPU的AES指令集来执行操作,以提高加密和解密的性能。
:是一个 Java 虚拟机(JVM)选项,用于禁用 垃圾收集器的预防性垃圾回收(Preventive GC)机制。预防性垃圾回收是 G1 垃圾收集器的一项特性,旨在在堆内存使用率较低时主动触发垃圾回收,以避免堆内存达到极限。
这个选项通常用于开发和
以下是一个示例的 配置文件:
请注意,具体的配置取决于您的硬件资源、工作负载和性能需求。您可以根据您的具体情况来调整和优化JVM参数。
3、log.properties 配置文件
4、node.properties 配置文件
2)worker 节点配置
1、config.properties 配置文件
以下是一个Trino工作节点的配置文件示例config.properties,用于配置工作节点的基本设置,包括通信、内存、线程池以及插件等。
以下是示例配置文件中的各项设置的含义:
:设置当前节点为工作节点而非协调器节点。
:用于决定协调器节点是否应该纳入查询计算资源的调度范围。当该参数设置为true时,协调器节点可以作为一个普通的计算节点来执行查询,从而帮助处理计算负载。当设置false,这将确保协调器节点不会执行查询,从而避免了性能瓶颈问题,一般是设置false,禁用协调节点又充当worker节点使用。
:HTTP服务器监听的端口号,用于接收REST API请求。
:单个查询可用的最大内存数量。
:单个工作节点可用于执行查询的最大内存数量。
:启用节点发现服务器,用于协调 Trino 群集中的各个节点。
:发现服务器节点的URL。
:控制通信时,HTTP客户端保持活动状态的时间。
:当HTTP客户端处于空闲状态时,客户端关闭连接之前保持空闲的时间量。
:在工作节点上同时执行的最大任务数。
:在工作节点上同时写入数据的最大任务数。
:JVM初始堆大小作为RAM百分比的设置。
:为Trino查询准备的每个节点之外的堆剩余空间。
请注意,这只是一个示例配置,您可以根据您自己的需求进行修改。有关更多配置参数和详细信息,请参阅官方文档:https://trino.io/docs/current/installation/deployment.html。
2、jvm.config 配置文件
下面是一个Trino工作节点的示例配置文件,它包含了一些常用的JVM参数,可以帮助你优化Trino的性能和内存利用率:
这里是每个参数的含义:
: 使用JVM的服务模式,通常是用于长时间运行的应用程序。
: 设置JVM可用的最大堆内存为16GB。
: 启用G1垃圾回收器。
: 设置G1 GC的堆区域大小为16MB。
: 在内存溢出时生成堆内存转储文件。
: 在内存溢出时强制杀死Trino进程。
: 将JVM错误信息输出到指定的错误文件中。
: 启用显式垃圾回收操作。
: 指定Hadoop本机库的路径。
: 允许JVM附加到它自己的进程,有助于诊断和调试。
这只是一个基础配置文件,用户可以根据各自的需求和系统资源状况进行微调。同时需要注意的是,在配置JVM参数时,一定要谨慎,了解每个参数的含义和影响,并进行适当的测试和调优,以确保系统的稳定性和性能。
3、log.properties 配置文件
4、node.properties 配置文件
四、环境准备
如已经有环境了,可以忽略,如想快熟部署Presto(Trino)环境可参考我这篇文章:【大数据】通过 docker-compose 快速部署 Presto(Trino)保姆级教程
五、Trino 中的 数据源(catalog)
在Trino中,catalog是一种用于管理数据连接和数据源的概念。一个catalog可以代表一个数据库、一个hive实例、或者其他支持的数据源。Trino可以通过启用不同的catalog来连接和查询不同的数据源,这样你就可以使用一个Trino集群查询多个数据源中的数据,而不需要使用不同的工具和语言进行查询。
Trino中支持的catalog包括:
系统catalog:包括system、memory、information_schema和metadata,用于管理和查询Trino系统和运行时信息。
Hive catalog:用于连接处理Hive数据。
Mysql catalog:用于连接在Trino中,catalog是一种用于管理数据连接和数据源的概念。一个catalog可以代表一个数据库、一个hive实例、或者其他支持的数据源。Trino可以通过启用不同的catalog来连接和查询不同的数据源,这样你就可以使用一个Trino集群查询多个数据源中的数据,而不需要使用不同的工具和语言进行查询。
Trino中支持的catalog包括:
系统:包括、、和,用于管理和查询Trino系统和运行时信息。
:用于连接Mysql数据源。
:用于连接处理Hive数据。
:用于连接处理Kafka消息数据。
:用于连接处理Elasticsearch数据。
:用于连接处理关系型数据库。
:用于连接处理Cassandra NoSQL数据库。
除了以上常用的catalog,Trino还支持许多其他的catalog。你可以通过配置文件或者命令行参数来启用或禁用不同的catalog,以便连接和查询不同的数据源。当启用一个catalog时,需要为它配置连接参数和身份凭证等信息。Trino中的catalog提供了一种简便而灵活的方式来管理连接和查询多种数据源,使得数据查询和集成变得更加高效和便利。
官方文档:https://trino.io/docs/current/connector.html
六、Trino 数据类型
官方文档:https://trino.io/docs/current/language/types.html
1)基础数据类型
当字符串cast为,不足的字符用空格填充,多的字符被截断
当插入字符串到类型为的列,不足的字符用空格填充,多了就报错
当插入字符串到类型为的列,多了就报错
2)集合数据类型
3)日期时间数据类型
官方文档:https://trino.io/docs/current/functions.html
七、Trino 内置函数
Trino(之前叫Presto)提供了丰富的内置函数,可以满足各种SQL查询的需求。下面对Trino内置函数进行详细说明。
1)数学函数
:返回数值参数的绝对值。
:返回不小于参数的最小整数。
:返回不大于参数的最大整数。
:返回e的幂次方。
:返回参数的自然对数。
:返回参数的以10为底的对数。
:返回参数的平方根。
:返回第一个参数乘以第二个参数的幂次方。
2)字符串函数
: 连接两个或多个字符串。
:返回字符串的长度。
:返回字符串的子串,从指定位置开始(从1开始计算),如果提供长度参数,则截取固定长度。
:将字符串中的符合模式的字符串替换成替换字符串。
:将字符串转化成小写/大写。
:去掉字符串头尾指定的空格或字符。
:指定模式,并返回特定位置(从1开始计算)的匹配结果。
:将字符串中的符合模式的字符串替换成替换字符串。
3)日期时间函数
:将日期字符串转化成日期格式。
:返回当前日期。
:返回当前时间。
:返回当前时间戳。
:返回日期的年份。
:返回日期的月份。
:返回日期的日份。
:返回时间戳的小时部分。
:返回时间戳的分钟部分。
:返回时间戳的秒部分。
4)聚合函数
:返回记录数。count(*)表示所有行的行数,一般用于计算表的行数。count(expression)返回expression的不同值的数量。
:返回列数值的总和。
:返回数值列的平均值。
:返回列的最大值/最小值。
:将指定表达式的结果合并为一个数组。
5)逻辑函数
:如果条件为真,返回true_value,否则返回false_value。
:如果expression1等于expression2,则返回null。
:返回参数列表中第一个非空的值。
:逻辑运算符,返回相应的逻辑值。
6)类型转换函数
:将表达式转化为指定类型。
:尝试将表达式转化为指定类型,如果无法转化,则返回null。
:将指定的值序列化为JSON字符串。
:将一个JSON字符串反序列化为指定类型。
:将一个map(array)转化为一个数组(map)。
这些内置函数只是Trino中的部分函数,Trino还支持大量其他内置函数,可以参阅Trino的官方文档获得更详细、更全面的信息。
八、Trino 中的 SQL 语法
连接:
官方文档:https://trino.io/docs/current/sql.html
1)数据源语法
一般数据源配置在目录下
当然也可以通过sql创建,示例如下:
1、配置hive数据源
2、查看catalog
2)数据库语法(schemas)
在Trino中,catalog用于访问数据源和外部系统。每个catalog都可以包含一个或多个schema,每个schema包含一组相关的表。你可以在Trino中使用、、和等语句来管理。
语法:
以下是一些用于操作catalog schema的示例:
创建一个名为schema_test的新schema
【注意】如果登录时,没有带--scheme,就必须USE切换scheme,才能使用创建schema。
查看scheme
删除一个名为my_schema的schema
查看当前scheme
3)表 DDL 语法
在Trino中,你可以使用CREATE TABLE语句来创建表,使用ALTER TABLE来修改表的结构和元数据,并使用DROP TABLE来删除表。
下面分别介绍一下这几个操作的语法和参数:
1、创建表 - CREATE TABLE
语法:
使用创建一个新的表。下面是一个示例:
其中,my_table是你想要创建的表名,后面的括号中列出了表的列和对应的数据类型。在Trino中可以定义多种数据类型,如、、等等。更多数据类型可以查看Trino官方文档。
你可以使用CREATE TABLE的参数进行更高级的操作,例如指定分桶、分区和格式,以下是一些常用参数的示例:
这个示例中,表使用格式存储,按照column3和column4列进行了分区,使用column2列进行了分桶,并设置了10个桶。
2、修改表 - ALTER TABLE
使用命令修改现有表。下面是一些常见的用法:
添加列
修改列
删除列
添加分区
删除分区
3、删除表 - DROP TABLE
使用DROP TABLE语句删除现有表。下面是一个示例:
注意:删除一个表将会永久删除该表的全部数据,慎重操作!
4、trino 中的分区分桶
在Trino中,你可以使用分区(partition)和分桶(bucket)来优化查询性能,提高查询速度和效率。
1、分区(partition)
分区是指把数据按照一定规则划分成若干部分(比如按照日期、地区、类别等),每个部分就是一个分区。在Trino中,你可以使用 语句的 子句来创建一个分区表,你可以写入数据到这个表的每个分区。
使用分区对于查询过滤条件的列进行过滤非常高效。Trino实际上将所有数据按照分区规则分布到磁盘的不同目录下,当你执行包含了分区过滤的查询时,Trino会自动发现这个过滤条件,并且只读取符合条件的分区数据,这样就可以大大提高查询效率。
以下是一个创建一个按照日期分区的示例:
2、分桶(bucket)
分桶是将表中的数据划分成若干个桶(bucket)存储的方式。在Trino中,你可以使用 CREATE TABLE 语句的 和 子句来创建一个分桶表。在建表时,你需要定义一个或多个bucket列并设置桶的数量,Trino会根据这些设置把表中的数据分配到不同的桶中。
使用分桶后,Trino优化器可以将查询操作分配到不同的节点上并行执行,以实现更快的查询速度。比如,如果你的分桶表中有100个桶,Trino可以把这100个桶分配到100个不同的节点上并行执行查询操作,从而大大提高查询效率。
以下是一个创建分桶的示例:
4)添加数据
领取专属 10元无门槛券
私享最新 技术干货