1. 首页 > IT综合教程 > 正文

289. Presto/Trino大数据查询引擎培训

一、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

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

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息