一、Presto/Trino概述
Presto(现名Trino)是分布式SQL查询引擎,专为大数据分析设计,支持跨数据源查询,具有高性能、低延迟的特点。
1.1 Presto/Trino核心特性
- 分布式查询:MPP架构,线性扩展
- 多数据源:支持Hive、MySQL、Kafka等多种数据源
- 内存计算:基于内存的流水线执行
- 标准SQL:支持ANSI SQL标准
1.2 架构组件
Trino架构组件:
┌─────────────────────────────────────────┐
│ Coordinator │
│ - 解析SQL查询 │
│ - 生成执行计划 │
│ - 调度任务 │
└─────────────────────────────────────────┘
│
┌─────────┼─────────┐
▼ ▼ ▼
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ Worker │ │ Worker │ │ Worker │
│ - 执行任务 │ │ - 执行任务 │ │ - 执行任务 │
│ - 数据处理 │ │ - 数据处理 │ │ - 数据处理 │
└─────────────┘ └─────────────┘ └─────────────┘
│ │ │
└─────────┼─────────┘
▼
┌─────────────────────────────────────────┐
│ Data Sources │
│ Hive | MySQL | Kafka | S3 | ... │
└─────────────────────────────────────────┘
二、Trino安装部署
2.1 单机部署
# 下载Trino
wget https://repo1.maven.org/maven2/io/trino/trino-server/435/trino-server-435.tar.gz
# 解压安装
tar -xzf trino-server-435.tar.gz -C /opt/
ln -s /opt/trino-server-435 /opt/trino
# 创建配置目录
mkdir -p /opt/trino/etc
mkdir -p /var/log/trino
mkdir -p /var/lib/trino/data
# 创建配置文件
cat > /opt/trino/etc/node.properties << 'EOF'
node.environment=production
node.id=ffffffff-ffff-ffff-ffff-ffffffffffff
node.data-dir=/var/lib/trino/data
EOF
cat > /opt/trino/etc/jvm.config << 'EOF'
-server
-Xmx16G
-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
EOF
cat > /opt/trino/etc/config.properties << 'EOF'
coordinator=true
node-scheduler.include-coordinator=true
http-server.http.port=8080
discovery.uri=http://fgedudb:8080
EOF
cat > /opt/trino/etc/log.properties << 'EOF'
io.trino=INFO
EOF
# 启动Trino
/opt/trino/bin/launcher start
# 查看日志
tail -f /var/log/trino/server.log
# 输出示例
Started as 12345
Server started successfully
Listening on http://fgedudb:8080
Started as 12345
Server started successfully
Listening on http://fgedudb:8080
2.2 集群部署
# Coordinator配置
cat > /opt/trino/etc/config.properties << 'EOF'
coordinator=true
node-scheduler.include-coordinator=false
http-server.http.port=8080
discovery.uri=http://192.168.1.100:8080
EOF
# Worker配置
cat > /opt/trino/etc/config.properties << 'EOF'
coordinator=false
http-server.http.port=8080
discovery.uri=http://192.168.1.100:8080
EOF
# 启动服务
/opt/trino/bin/launcher start
# 使用CLI连接
wget https://repo1.maven.org/maven2/io/trino/trino-cli/435/trino-cli-435-executable.jar
mv trino-cli-435-executable.jar trino
chmod +x trino
# 连接Trino
./trino --server http://fgedudb:8080
三、Catalog配置
3.1 Hive连接器
# /opt/trino/etc/catalog/hive.properties
connector.name=hive
hive.metastore.uri=thrift://192.168.1.100:9083
hive.allow-drop-table=true
hive.allow-rename-table=true
hive.s3.aws-access-key=AKIAIOSFODNN7EXAMPLE
hive.s3.aws-secret-key=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
hive.s3.endpoint=http://192.168.1.200:9000
# 查询Hive数据
trino> SHOW SCHEMAS FROM hive;
trino> SHOW TABLES FROM hive.default;
trino> SELECT * FROM hive.default.users LIMIT 10;
3.2 MySQL连接器
# /opt/trino/etc/catalog/mysql.properties
connector.name=mysql
connection-url=jdbc:mysql://192.168.1.100:3306
connection-user=root
connection-password=secret
# 查询MySQL数据
trino> SHOW SCHEMAS FROM mysql;
trino> SELECT * FROM mysql.test.users;
3.3 Kafka连接器
# /opt/trino/etc/catalog/kafka.properties
connector.name=kafka
kafka.nodes=192.168.1.100:9092,192.168.1.101:9092
kafka.table-names=topic1,topic2
kafka.default-schema=default
# 查询Kafka数据
trino> SELECT * FROM kafka.default.topic1 LIMIT 10;
四、SQL查询
4.1 基本查询
-- 查看Catalog
SHOW CATALOGS;
-- 查看Schema
SHOW SCHEMAS FROM hive;
-- 查看表
SHOW TABLES FROM hive.default;
-- 查看表结构
DESCRIBE hive.default.users;
-- 查询数据
SELECT * FROM hive.default.users LIMIT 100;
-- 条件查询
SELECT id, name, email
FROM hive.default.users
WHERE created_at > DATE '2024-01-01'
ORDER BY created_at DESC;
-- 聚合查询
SELECT
DATE(created_at) as date,
COUNT(*) as user_count
FROM hive.default.users
GROUP BY DATE(created_at)
ORDER BY date DESC;
4.2 跨数据源查询
-- 跨数据源JOIN
SELECT
h.user_id,
h.action,
m.user_name,
m.email
FROM hive.default.user_logs h
JOIN mysql.production.users m ON h.user_id = m.id
WHERE h.log_date = DATE '2024-01-15';
-- 联合查询
SELECT * FROM hive.default.orders
UNION ALL
SELECT * FROM mysql.archive.orders;
-- 子查询
SELECT * FROM hive.default.users
WHERE id IN (
SELECT user_id FROM mysql.production.active_users
);
4.3 高级SQL
-- 窗口函数
SELECT
id,
name,
amount,
ROW_NUMBER() OVER (PARTITION BY category ORDER BY amount DESC) as rank,
SUM(amount) OVER (PARTITION BY category) as category_total
FROM hive.default.fgsales;
-- CTE表达式
WITH user_stats AS (
SELECT
user_id,
COUNT(*) as order_count,
SUM(amount) as total_amount
FROM hive.default.orders
GROUP BY user_id
)
SELECT * FROM user_stats WHERE order_count > 10;
-- 临时表
CREATE TABLE hive.temp.user_summary AS
SELECT user_id, COUNT(*) as cnt
FROM hive.default.orders
GROUP BY user_id;
-- INSERT
INSERT INTO hive.default.users (id, name, email)
VALUES (1, '风哥1号', 'zhangsan@fgedu.net.cn');
五、性能优化
5.1 查询优化
-- 查看查询计划
EXPLAIN SELECT * FROM hive.default.users WHERE id = 1;
-- 查看详细计划
EXPLAIN ANALYZE SELECT * FROM hive.default.users WHERE id = 1;
-- 使用分区裁剪
SELECT * FROM hive.default.logs
WHERE dt = '2024-01-15' AND hour = 10;
-- 使用列裁剪
SELECT id, name FROM hive.default.users;
-- 使用谓词下推
SELECT * FROM hive.default.orders
WHERE user_id = 100 AND status = 'completed';
-- 使用JOIN优化
-- 小表放左边
SELECT s.*, u.name
FROM small_table s
JOIN large_table l ON s.id = l.id;
5.2 配置优化
# config.properties优化
query.max-memory-per-node=8GB
query.max-memory=100GB
query.max-total-memory-per-node=16GB
query.max-history=100
query.min-expire-age=30m
# 内存配置
# jvm.config
-Xmx32G
-XX:InitialRAMPercentage=80
-XX:MaxRAMPercentage=80
# 并行度配置
task.concurrency=16
task.writer-count=4
六、资源管理
6.1 资源队列
# /opt/trino/etc/resource-groups.properties
resource-groups.configuration-manager=file
resource-groups.config-file=/opt/trino/etc/resource-groups.json
# resource-groups.json
{
"rootGroups": [
{
"name": "global",
"softMemoryLimit": "80%",
"hardConcurrencyLimit": 100,
"maxQueued": 1000,
"schedulingPolicy": "weighted",
"jmxExport": true,
"subGroups": [
{
"name": "admin",
"softMemoryLimit": "30%",
"hardConcurrencyLimit": 50,
"maxQueued": 100,
"schedulingWeight": 2
},
{
"name": "user",
"softMemoryLimit": "50%",
"hardConcurrencyLimit": 30,
"maxQueued": 500,
"schedulingWeight": 1
}
]
}
]
}
七、监控与运维
7.1 Web UI监控
# 访问Web UI
http://fgedudb:8080
# 查看查询列表
# 查看正在执行的查询
# 查看查询详情和执行计划
# 查看Worker状态
# 使用CLI查看状态
trino> SHOW SESSION;
trino> SELECT * FROM system.runtime.nodes;
trino> SELECT * FROM system.runtime.queries;
7.2 JMX监控
# 启用JMX
# jvm.config
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=9010
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
# 关键JMX指标
trino.execution=QueryManager
trino.memory=MemoryPool
trino.executor=TaskExecutor
# Prometheus监控
# /opt/trino/etc/catalog/prometheus.properties
connector.name=prometheus
prometheus.url=http://fgedudb:9090
八、运维命令
8.1 常用管理命令
# 启动服务
/opt/trino/bin/launcher start
# 停止服务
/opt/trino/bin/launcher stop
# 重启服务
/opt/trino/bin/launcher restart
# 查看状态
/opt/trino/bin/launcher status
# 前台运行
/opt/trino/bin/launcher run
# 查看日志
tail -f /var/log/trino/server.log
# 使用CLI
./trino --server http://fgedudb:8080
./trino --server http://fgedudb:8080 --catalog hive --schema default
# 执行SQL文件
./trino --server http://fgedudb:8080 -f query.sql
# 输出格式
./trino --server http://fgedudb:8080 --output-format JSON
九、最佳实践
| 配置项 | 建议值 | 说明 |
|---|---|---|
| query.max-memory | 集群内存70% | 避免OOM |
| task.concurrency | CPU核心数 | 并行度 |
| discovery.uri | Coordinator地址 | 服务发现 |
注意事项:
- 合理配置内存避免OOM
- 使用分区裁剪提升性能
- 监控长时间运行的查询
- 定期清理临时数据
十、总结
Trino是高性能的分布式SQL查询引擎。通过本培训文档,您应该掌握了:
学习交流加群风哥微信: itpux-com
- Trino架构和核心概念
- 单机和集群部署方法
- Catalog连接器配置
- SQL查询和跨数据源查询
- 性能优化方法
- 资源管理和监控运维
IT运维培训文档系列 | 第289篇 | Presto/Trino大数据查询引擎培训
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
