https://blog.csdn.net/shy_snow/article/details/130523338
Trino安装部署及使用
Trino是一个分布式SQL查询引擎,旨在查询分布在一个或多个异构数据源上的大型数据集。支持丰富的数据源连接方式,支持库、表和字段级别的权限控制,以及支持通过资源组实现类似队列的资源使用控制。这些都需要手工进行配置,这是不方便的地方。
一、Trino部署
官网:https://trino.io
环境依赖:
Java 17.0.3版本
Python 2.6.x, 2.7.x, or 3.x
1. 下载
wget https://repo1.maven.org/maven2/io/trino/trino-server/412/trino-server-412.tar.gz
https://download.csdn.net/download/shy_snow/87675932
2. 解压
将压缩包解压至trino-server-412,我们称之为安装目录
tar -xzvf trino-server-412.tar.gz
3. 配置
在安装目录中中创建etc目录,在目录中创建以下配置文件:
node.properties:特定于每个节点的环境配置。
jvm.config:Java 虚拟机的命令行选项。
config.properties: Trino 服务器的配置。
log.properties:日志属性。
catalogs下的properties:数据源的配置。
1.节点属性
node.properties是节点属性文件,基本配置如下
node.environment=production
node.id=ffffffff-ffff-ffff-ffff-ffffffffffff
node.data-dir=/var/trino/data
node.environment:环境名称。集群中所有的trino节点环境名称必须相同
node.id:trino的唯一标识符,每个节点的node.id必须是唯一的
node.data-dir:数据目录的位置。存储日志和其他数据
2.JVM配置
JVM 配置文件etc/jvm.config包含用于启动 Java 虚拟机的命令行选项列表。基本配置如下
-server
-Xmx8G
-XX:InitialRAMPercentage=80
-XX:MaxRAMPercentage=80
-XX:G1HeapRegionSize=32M
-XX:+ExplicitGCInvokesConcurrent
-XX:+ExitOnOutOfMemoryError
-XX:+HeapDumpOnOutOfMemoryError
-XX:-OmitStackTraceInFastThrow
-XX:ReservedCodeCacheSize=512M
-XX:PerMethodRecompilationCutoff=10000
-XX:PerBytecodeRecompilationCutoff=10000
-Djdk.attach.allowAttachSelf=true
-Djdk.nio.maxCachedBufferSize=2000000
-XX:+UnlockDiagnosticVMOptions
-XX:+UseAESCTRIntrinsics
# Disable Preventive GC for performance reasons (JDK-8293861)
-XX:-G1UsePreventiveGC
3.配置属性文件etc/config.properties
配置属性文件etc/config.properties包含 Trino 服务器的配置。每台 Trino 服务器都可以充当协调器和工作器,但是专用一台机器只执行协调工作可以在更大的集群上提供最佳性能。
coordinator的基本配置如下。
#单机的node-scheduler.include-coordinator设为true
node-scheduler.include-coordinator=true
#Trino uses HTTP for all communication, internal and external.
http-server.http.port=8080
#注册和心跳地址uri,后面的8080和http-server.http.port保持一致
discovery.uri=http://192.168.129.135:8080
worker的基本配置如下
coordinator=false
http-server.http.port=8080
discovery.uri=http://192.168.129.135:8080
4.日志级别
日志级别文件etc/log.properties,基本信息如下
io.trino=INFO
5.Catalog属性
Trino访问数据通过connector,它配置在catalog目录内,我们创建etc/catalog目录,
mysql源配置如下,我们在catalog目录下创建mysql.properties
connector.name=mysql
connection-url=jdbc:mysql://192.168.129.102:3306?useSSL=false
connection-user=root
connection-password=123456
- 配置jdk
机器是使用的jdk8,我们不做升级。修改启动脚本/trino-server-412/bin/launcher使其使用jdk17
JAVA_HOME17=/usr/java/jdk-17.0.6
PATH=$JAVA_HOME17/bin:$JAVA_HOME17/jre/bin:$PATH
exec "$(dirname "$0")/launcher.py" "$@"
4. 服务端启动
./trino-server-412/bin/launcher start
tail -f /data/trino/data/var/log/server.log
1.web访问地址
http://192.168.129.135:8080
5. 客户端
1.下载
下载之后将trino-cli-412-executable.jar改成trino-cli,并给trino-cli添加可执行权限
wget https://repo1.maven.org/maven2/io/trino/trino-cli/400/trino-cli-412-executable.jar
2.客户端启动
mv trino-cli-412-executable.jar trino-cli
chmod +x trino-cli
./trino-cli --server localhost:8080
6. dbeaver连接
7. jdbc连接
import java.sql.*;
public class TrinoJdbc
{
public static void main(String[] args)
{
String url = "jdbc:trino://192.168.129.135:8080/hive/public_train?user=root&password=&SSL=false";
Connection connection = null;
ResultSet rs = null;
try
{
connection = DriverManager.getConnection(url);
Statement statement = connection.createStatement();
rs = statement.executeQuery("select * from test limit 10");
if (rs != null)
{
while (rs.next())
{
System.out.println(rs.getString("id") + "," + rs.getString("name"));
}
}
}
catch (SQLException e)
{
e.printStackTrace();
}
finally
{
if (connection != null)
{
try
{
connection.close();
}
catch (SQLException e)
{
e.printStackTrace();
}
}
}
}
}
pom.xml增加trino的jdbc驱动
<dependency>
<groupId>io.trino</groupId>
<artifactId>trino-jdbc</artifactId>
<version>412</version>
</dependency>
二、连接配置和使用
Trino支持的连接 https://trino.io/docs/current/connector.html
Accumulo
Atop
BigQuery
Black Hole
Cassandra
ClickHouse
Delta Lake
Druid
Elasticsearch
Google Sheets
Hive
Hudi
Iceberg
Ignite
JMX
Kafka
Kinesis
Kudu
Local File
MariaDB
Memory
MongoDB
MySQL
Oracle
Phoenix
Pinot
PostgreSQL
Prometheus
Redis
Redshift
SingleStore
SQL Server
System
Thrift
TPCDS
TPCH
1. 集成mysql
1.配置参考上面的3.5Catalog属性,在catalog目录下创建mysql.properties后重启trino
#connector.name是
connector.name=mysql
connection-url=jdbc:mysql://192.168.129.102:3306?useSSL=false
connection-user=root
connection-password=123456
2.查询
//如果查询失败显示没有查询权限,那trino目录权限就需要改成有hive查询权限的账号。然后重启 select * from catalog.schema.table
3.常用命令
显示所有的catalog (catalog目录下的properties文件名)
show catalogs;
查看mysql下所有的schemas (对应为数据库)
show schemas from mysql
查看表
show tables from mysql.cdc;
查询表数据
use mysql.cdc;
select * from mysql.cdc.lineitem limit 10;
退出客户端 quit;
2. 集成hive(有kerberos认证)
hive源配置如下,我们在catalog目录下创建文件hive.properties。如果要配置多个hive,使用不同的properties文件名即可,比如hive-108.properties,hive-root.properties。catalog就是hive.properties的文件名。
core-site.xml, hdfs-site.xml可以从hadoop集群复制一份然后放到配置文件中。
connector.name=hive
hive.metastore.uri=thrift://cdh129130:9083
hive.config.resources=/etc/hive/conf/core-site.xml,/etc/hive/conf/hdfs-site.xml
# 访问hive metastore的Kerberos信息
hive.metastore.authentication.type=KERBEROS
hive.metastore.service.principal=hive/cdh129130@MYCDH
hive.metastore.client.principal=hive/cdh129130@MYCDH
hive.metastore.client.keytab=/root/hive.keytab
#访问HDFS的Kerberos信息
hive.hdfs.authentication.type=KERBEROS
hive.hdfs.presto.principal=hive/cdh129130@MYCDH
hive.hdfs.presto.keytab=/root/hive.keytab
修改jvm.properties
添加如下属性:
-Dsun.security.krb5.debug = true
-Dlog.enable-console = true
-Djava.security.krb5.conf=/etc/krb5.conf
修改/etc/krb5.conf
在 /etc/krb5.conf 文件的 libdefaults 部分中添加如下属性:
allow_weak_crypto = true
重启Trion
/data/trino/trino-server-412/bin/launcher restart
使用hive连接
/data/trino/trino-cli --server 192.168.129.135:8080
trino> show catalogs;
trino> show schemas from hive;
trino> select * from hive.public_train.test;
-- 建表
CREATE TABLE hive.public_train.page_views (
view_time timestamp,
user_id bigint,
page_url varchar,
ds date,
country varchar
)
WITH (
format = 'ORC',
partitioned_by = ARRAY['ds', 'country'],
bucketed_by = ARRAY['user_id'],
bucket_count = 50
)
3. 集成hudi
支持Hudi version 0.12.2 or higher. 必须要能访问HMS,metastore的配置和hive相同。
在catalog目录下创建文件hudi.properties。
connector.name=hudi
hive.metastore.uri=thrift://cdh129130:9083
hive.config.resources=/etc/hive/conf/core-site.xml,/etc/hive/conf/hdfs-site.xml
# 访问hive metastore配置
hive.metastore.authentication.type=KERBEROS
hive.metastore.service.principal=hive/cdh129130@MYCDH
hive.metastore.client.principal=hive/cdh129130@MYCDH
hive.metastore.client.keytab=/root/hive.keytab
#配置Presto访问HDFS的Kerberos信息,该段配置可以只存在Presto的Worker节点
hive.hdfs.authentication.type=KERBEROS
hive.hdfs.presto.principal=hive/cdh129130@MYCDH
hive.hdfs.presto.keytab=/root/hive.keytab
show schemas from hudi;
use hudi.hudi_db;
show tables from hudi.hudi_db;
select * from hudi.hudi_db.hudi_mor_tbl;
4. 集成Kafka
官网文档: https://trino.io/docs/current/connector/kafka.html
在etc/catalog目录下创建文件kafka.properties
connector.name=kafka
kafka.nodes=192.168.128.130:9092
#kafka的topic,需要手工配置才能在trino中可见
kafka.table-names=test,test2
#配置table的消息类型和字段信息等的文件目录,默认是etc/kafka
kafka.table-description-dir=/data/trino/trino-server-412/etc/kafka
在etc/kafka下配置表信息的json文件,以test为例
vi test.json
{
"tableName": "test",
"schemaName": "default",
"topicName": "test",
"message": {
"dataFormat": "csv",
"fields": [
{
"name": "id",
"type": "VARCHAR",
"mapping": "0"
},
{
"name": "names",
"type": "VARCHAR",
"mapping": "1"
},
{
"name": "addr",
"type": "VARCHAR",
"mapping": "2"
}
]
}
}
在kafka里向topic(test)发送三条数据用于查询测试
查询kafka.default.test
/data/trino/trino-cli --server 192.168.129.135:8080
trino> select * from kafka.default.test;
三、Rules规则配置进行库表权限控制
1. 系统级访问控制文件
vi etc/access-control.properties
# default,allow-all,read-only,file
access-control.name=file
# 规则json本地文件
security.config-file=etc/rules.json
# etc/rules.json文件的自动的refresh的周期
security.refresh-period=1s
System access control name | 说明 |
---|---|
default | 默认值.除了用户模拟(user impersonation)之外,所有操作都是允许的。 |
allow-all | 所有操作都是允许的。 |
read-only | 只读。允许读数据和元数据, 但是不允许写. |
file | 授权规则是在配置文件中指定的, 参考 File-based access control. |
除了通过配置系统级别的访问控制,access-control.name=file时,可以在rules.json配置文件中分别配置catalog, schema, 和table级别的rules规则配置。catalog rules对整个catalog访问进行控制。table表和schema模式规则用于指定谁可以为模式和表创建、删除、更改、选择、插入、删除等。对于每个规则集,权限基于从上到下读取的第一个匹配规则。如果没有匹配的规则,则拒绝访问。如果根本没有提供任何规则,则授予访问权限。
下面是access-control.name=file时etc/rules.json的catalog, schema, 和table级别的rules规则配置说明。
2. catalog规则配置
每个catalog规则都由以下属性组成:
user(可选):正则表达式以与用户名匹配。默认值为.*。
role(可选):用于与角色名称匹配的正则表达式。默认值为.*。
group(可选):用于与组名称匹配的正则表达式。默认值为.*。
catalog(可选):与目录名称匹配的正则表达式。默认值为.*。
allow(必需):指示用户是否有权访问目录的字符串。此值可以是all、 read-only或none,并且默认为none。
vi etc/rules.json
{
"catalogs": [
{
"role": "admin",
"catalog": ".*",
"allow": "all"
},
{
"group": "hive",
"catalog": "(hive|hive135)",
"allow": "all"
},
{
"user": "root",
"catalog": "(mysql|hive|system)",
"allow": true
},
{
"user": "guest",
"catalog": "mysql",
"allow": "read-only"
},
{
"catalog": "system",
"allow": "none"
}
]
}
3. schema规则配置
每个schema规则都由以下字段组成:
user(可选):正则表达式以与用户名匹配。默认值为.*。
role(可选):用于与role名称匹配的正则表达式。默认值为.*。
group(可选):用于与group名称匹配的正则表达式。默认值为.*。
catalog(可选):与catalog名称匹配的正则表达式。默认值为.*。
schema(可选):与schema名称匹配的正则表达式。默认值为.*。
owner(必需):布尔值,指示用户是否被视为schema的所有者。默认为false。
{
"schemas": [
{
"role": "admin",
"schema": ".*",
"owner": true
},
{
"user": "guest",
"owner": false
},
{
"catalog": "default",
"schema": "default",
"owner": true
}
]
}
4. table规则配置
这些规则管理授予特定表的权限。
user(可选):正则表达式以与用户名匹配。
group(可选):正则表达式,用于与用户所属的每个用户组进行匹配。
schema(可选):与模式名称匹配的正则表达式。
table(可选):与表名称匹配的正则表达式。
privileges(必需):SELECT、INSERT、DELETE、UPDATE、OWNERSHIP、GRANT_SELECT中的零个或多个。
columns(可选):列约束列表。
filter(可选):表的布尔筛选器表达式。
filter_environment(可选):筛选器评估过程中使用的环境。
{
"schemas": [
{
"role": "admin",
"schema": ".*",
"owner": true
},
{
"group": "finance|human_resources",
"schema": "hr",
"owner": true
},
{
"user": "guest",
"schema": "guest*",
"owner": true
},
{
"catalog": "mysql",
"schema": "default",
"owner": true
}
],
"tables": [
{
"group": "admin",
"privileges": ["SELECT", "INSERT", "DELETE", "UPDATE", "OWNERSHIP"]
},
{
"user": "banned_user",
"privileges": []
},
{
"catalog": "mysql",
"schema": "hr",
"table": "employee",
"privileges": ["SELECT", "INSERT", "DELETE"],
"filter": "user = current_user",
"filter_environment": {
"user": "system_user"
}
},
{
"catalog": "mysql",
"schema": "hr",
"table": ".*",
"privileges": ["SELECT"],
"columns" : [
{
"name": "address",
"allow": false
},
{
"name": "ssn",
"mask": "substring(credit_card, -4)",
"mask_environment": {
"user": "system_user"
}
}
]
}
]
}
表级别访问控制
没有任何权限的用户无法访问表
记录级别过滤
根据不同用户过滤查询结果"filter": “user = current_user”
/data/trino/trino-cli --server 192.168.129.135:8080 --user admin
trino> select * from mysql.hr.employee;
id | user | address | credit_card | ssn
----+-------+---------+--------------+-------
3 | admin | addr | 1234-56-7893 | 33333
(1 row)
/data/trino/trino-cli --server 192.168.129.135:8080 --user human_resources
trino> select * from mysql.hr.employee;
id | user | address | credit_card | ssn
----+-----------------+---------+--------------+-------
2 | human_resources | addr | 1234-56-7892 | 22222
(1 row)
字段级别限制
对非属主不允许查询address 敏感字段 “columns” : [ { “name”: “address”, “allow”: false }]
并对ssn字段进行处理这里是截取后四位 “mask”: " substring(credit_card, -4) "
5. 用户组userGroup规则配置
https://trino.io/docs/current/security/group-file.html
vi etc/group-provider.properties
group-provider.name=file
# 用户组配置文件
file.group-file=/data/trino/trino-server-412/etc/group.txt
file.refresh-period=5s
vi etc/group.txt
用户组文件包含组和成员的列表,每行一个,用冒号分隔。用户之间用逗号分隔。group.txt文件修改后,默认5s自动更新。
group_name:user_1,user_2,user_3
hive:test,zxc
admin:root,admin
guest:guest
human_resources:human_resources
6. 可见性说明
要使catalog、schema或table在SHOW命令中可见,用户必须至少对该项或任何嵌套项具有一个权限。嵌套项不需要已经存在,因为任何潜在的权限都会使该项可见。具体的:
catalog:如果用户是任何嵌套schema的所有者,拥有任何嵌套表或表函数的权限,或者拥有在catalog中设置会话属性的权限,则可见。
schema:如果用户是架构的所有者,或者对任何嵌套表或表函数具有权限,则可见。
table:如果用户对该表具有任何权限,则可见。
四、Resource groups资源组进行资源隔离限制
Trino Resource groups配置中有两个核心概念:
一是 资源组,可以类比于 Hadoop Yarn 的队列,每个资源组中定义了最大并发、调度权重等参数,每个资源组还可以配置子资源组;
Trino Resource groups资源组用于在提交查询任务时对资源使用情况进行限制,可以对提交的查询强制执行队列排队策略,也可以在子组之间分配资源。trino查询会被分配到某个资源组,并消耗该组(及其父资源组)的资源。当资源组用完资源时,新的查询进入队列等待。
name(必需):组的名称。可能是一个模板(见下文)。
maxQueued(必需):排队查询的最大数量。一旦达到此限制,将拒绝新的查询。
softConcurrencyLimit(可选):并发运行的查询数,在此之后,只有当所有低于其软限制的对等资源组都不合格或所有符合条件的对等资源都高于软限制时,才会运行新的查询。
hardConcurrencyLimit(必需):正在运行的查询的最大数量。
softMemoryLimit(必需):在新查询进入队列之前,此组可以使用的最大分布式内存量。可以指定为绝对值(即1GB)或集群内存的百分比(即10%)。
softCpuLimit(可选):在对最大运行查询数进行惩罚之前,该组在一段时间内可能使用的最大CPU时间量(请参阅cpuQuotaPeriod)。还必须指定hardCpuLimit。
hardCpuLimit(可选):该组在一段时间内可能使用的最大CPU时间。
schedulingPolicy(可选):指定如何选择排队的查询来运行,以及子组如何有资格启动其查询。可以是以下三个值之一:
fair(默认):排队的查询是先入先出处理的,子组必须轮流启动新的查询(如果有排队的话)。
weighted_fair:根据子组的调度权重和它们已经同时运行的查询数来选择子组。子组运行查询的预期份额是基于所有当前符合条件的子组的权重计算的。选择相对于其共享具有最小并发性的子组来启动下一个查询。
query_priority:所有子组也必须配置query_priorty。排队查询严格按照优先级进行选择。
schedulingWeight(可选):权重和weighted_fair调度策略中使用的该子组的权重。默认值为1。请参见调度权重示例。
jmxExport(可选):如果为true,则将组统计信息导出到JMX进行监控。默认为false。
子组(可选):子组列表。
二是 选择器,选择器用来映射用户与资源组的关系,符合条件的用户才可以提交 sql 至某个资源组。
Resource groups资源组的配置有两种配置方式: 一种是基于 file 静态文件配置,一种是基于动态 db 的方式
1. file文件方式配置Resource groups资源组
配置etc/resource-groups.properties
有file文件方式还是db数据库方式配置两种配置方式
# 指定file文件方式还是db数据库方式配置
resource-groups.configuration-manager=file
# JSON configuration file
resource-groups.config-file=etc/resource-groups.json
在etc/resource-groups.json中配置资源组及资源限制,以及选择器
{
"rootGroups": [
{
"name": "default",
"softMemoryLimit": "60%",
"hardConcurrencyLimit": 5000,
"schedulingWeight": 60,
"maxQueued": 5000,
"schedulingPolicy": "fair",
"jmxExport": false
},
{
"name": "queueJdbc",
"softMemoryLimit": "40%",
"schedulingWeight": 40,
"hardConcurrencyLimit": 5000,
"maxQueued": 5000,
"schedulingPolicy": "fair",
"jmxExport": false
},
{
"name": "queueCli",
"softMemoryLimit": "40%",
"schedulingWeight": 40,
"hardConcurrencyLimit": 5000,
"maxQueued": 5000,
"schedulingPolicy": "fair",
"jmxExport": false
}
],
"selectors": [
{
"userGroup": "hive",
"group": "queueJdbc"
},
{
"userGroup": "human_resources",
"group": "queueCli"
},
{
"source": ".*cli*",
"clientTags": ["queueCli"],
"group": "queueCli"
},
{
"source": ".*jdbc*",
"clientTags": ["queueJdbc"],
"group": "queueJdbc"
},
{
"group": "default"
}
],
"cpuQuotaPeriod": "1h"
}
根据用户匹配不同的用户组(租户),分配不同的队列执行查询
“selectors”: [
{
“userGroup”: “hive”,
“group”: “queueJdbc”
},
{
“userGroup”: “human_resources”,
“group”: “queueCli”
}]
#使用human_resources组的human_resources用户
/data/trino/trino-cli --server 192.168.129.135:8080 --user human_resources
trino> use hive.public_train;
trino:public_train> select current_user,current_groups(),current_catalog,current_schema;
trino:public_train> select * from test limit 1;
#使用hive组的test用户
/data/trino/trino-cli --server 192.168.129.135:8080 --user test
trino> use hive.public_train;
trino:public_train> select current_user,current_groups(),current_catalog,current_schema;
trino:public_train> select * from test limit 1;
使用client-tags区分不同的客户端并匹配不同的队列
[test@cdh129135 trino-server-412]$ /data/trino/trino-cli --server 192.168.129.135:8080 --client-tags=queueCli --user test
trino> select * from mysql.cdc.zxc_t1
import java.sql.*;
public class TrinoJdbc
{
public static void main(String[] args)
{
// URL parameters
String url = "jdbc:trino://192.168.129.135:8080/hive/public_train?user=root&password=&SSL=false&clientTags=queueJdbc&source=jdbc"; // &clientTags=queueJdbc&source=jdbc
Connection connection = null;
try
{
connection = DriverManager.getConnection(url);
Statement statement = connection.createStatement();
ResultSet rs = null;
rs = statement.executeQuery("select * from test limit 10");
if (rs != null)
{
while (rs.next())
{
System.out.println(rs.getString(1) + "," + rs.getString(2));
}
}
}
catch (SQLException e)
{
e.printStackTrace();
}
finally
{
if (connection != null)
{
try
{
connection.close();
}
catch (SQLException e)
{
e.printStackTrace();
}
}
}
}
}
2. 数据库方式配置Resource groups资源组
db数据库方式配置etc/resource-groups.properties
resource-groups.configuration-manager=db
resource-groups.config-db-url=jdbc:mysql://192.168.129.102:3306/resource_groups
resource-groups.config-db-user=root
resource-groups.config-db-password=123456
数据库类型支持MySQL, PostgreSQL, Oracle。
重启trino会自动创建表
选择器表中的规则按照优先级字段中值的降序进行处理。
resource_groups表还包含一个environment字段,该字段与node properties中node.environment属性中包含的值相匹配。这允许在需要时将不同Trino集群的资源组配置存储在同一数据库中。
配置每秒从数据库中重新加载一次,更改会自动反映到传入的查询中。