本文详细介绍Presto即席查询引擎与Hadoop生态的集成实战,包括Presto概述、架构原理、集群部署、连接器配置、SQL查询、性能优化等内容,风哥教程参考Presto官方文档Getting Started、Deployment、Connectors等内容,适合大数据工程师使用。学习交流加群风哥QQ113257174
Part01-基础概念与理论知识
1.1 Presto概述与核心特性
Presto是一个开源的分布式SQL查询引擎,专门用于快速查询大数据集。它可以查询HDFS、Hive、HBase、关系型数据库等多种数据源。更多视频教程www.fgedu.net.cn
- 即席查询:交互式SQL查询
- 高性能:内存计算,比Hive快10-100倍
- 多数据源:支持Hive、HBase、MySQL、PostgreSQL等
- 标准SQL:支持ANSI SQL
- 可扩展:分布式架构,线性扩展
- 企业级:安全认证、权限控制
1.2 Presto架构与工作原理
Presto采用主从架构,包含Coordinator和Worker两种节点:
Coordinator:
– 解析SQL语句
– 生成执行计划
– 调度任务
– 管理Worker节点
– 提供Web UI
Worker:
– 执行任务
– 处理数据
– 与其他Worker交换数据
# 查询执行流程
1. 客户端提交SQL到Coordinator
2. Coordinator解析SQL,生成逻辑执行计划
3. Coordinator优化执行计划,生成物理执行计划
4. Coordinator将任务分发到Worker节点
5. Worker并行执行任务
6. Worker之间交换数据
7. Coordinator汇总结果返回给客户端
1.3 Presto连接器介绍
Presto通过连接器支持多种数据源:
- Hive Connector:查询Hive表
- HDFS Connector:直接查询HDFS文件
- HBase Connector:查询HBase
- MySQL/PostgreSQL Connector:查询关系型数据库
- Kafka Connector:查询Kafka数据
- Iceberg/Hudi Connector:查询数据湖表
Part02-生产环境规划与建议
2.1 Presto集群规划
Presto集群规划要点:
Coordinator节点:
– 数量:1-2个(主备)
– 配置:16核64GB
– 磁盘:SSD 500GB
Worker节点:
– 数量:5-100个(根据数据量)
– 配置:16核64GB-32核128GB
– 磁盘:SSD 1TB-2TB
– 网络:万兆网卡
# 内存分配
查询内存:JVM heap的50%-70%
系统内存:预留30%给操作系统
# 目录规划
安装目录:/bigdata/app/presto
数据目录:/bigdata/fgdata/presto
日志目录:/bigdata/fgdata/logs/presto
2.2 Presto核心配置
Presto核心配置建议:
coordinator=true
node-scheduler.include-coordinator=false
http-server.http.port=8080
query.max-memory=50GB
query.max-memory-per-node=10GB
query.max-total-memory-per-node=15GB
discovery-server.enabled=true
discovery.uri=http://fgedu-presto-coordinator:8080
# jvm.config
-server
-Xmx50G
-Xms50G
-XX:+UseG1GC
-XX:G1HeapRegionSize=32M
-XX:+UseGCOverheadLimit
-XX:+ExplicitGCInvokesConcurrent
-XX:+HeapDumpOnOutOfMemoryError
-XX:+ExitOnOutOfMemoryError
-XX:HeapDumpPath=/bigdata/fgdata/presto/heapdump
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-Xloggc:/bigdata/fgdata/logs/presto/gc.log
# node.properties
node.environment=production
node.id=fgedu-presto-coordinator-01
node.data-dir=/bigdata/fgdata/presto
# log.properties
com.facebook.presto=INFO
2.3 资源配置建议
资源配置建议:
- 小型集群:5个Worker,每台16核64GB,查询内存300GB
- 中型集群:20个Worker,每台32核128GB,查询内存1.5TB
- 大型集群:50个Worker,每台32核256GB,查询内存5TB
from bigdata视频:www.itpux.com
Part03-生产环境项目实施方案
3.1 Presto集群安装部署
3.1.1 下载安装Presto
cd /bigdata/app
wget https://repo1.maven.org/maven2/com/facebook/presto/presto-server/0.285/presto-server-0.285.tar.gz
tar -zxvf presto-server-0.285.tar.gz
ln -s presto-server-0.285 presto
# 2. 创建目录
mkdir -p /bigdata/app/presto/etc
mkdir -p /bigdata/fgdata/presto
mkdir -p /bigdata/fgdata/logs/presto
# 3. 配置config.properties
cat > /bigdata/app/presto/etc/config.properties << ‘EOF’
coordinator=true
node-scheduler.include-coordinator=false
http-server.http.port=8080
query.max-memory=50GB
query.max-memory-per-node=10GB
query.max-total-memory-per-node=15GB
discovery-server.enabled=true
discovery.uri=http://fgedu-presto-coordinator:8080
EOF
# 4. 配置jvm.config
cat > /bigdata/app/presto/etc/jvm.config << ‘EOF’
-server
-Xmx50G
-Xms50G
-XX:+UseG1GC
-XX:G1HeapRegionSize=32M
-XX:+UseGCOverheadLimit
-XX:+ExplicitGCInvokesConcurrent
-XX:+HeapDumpOnOutOfMemoryError
-XX:+ExitOnOutOfMemoryError
-XX:HeapDumpPath=/bigdata/fgdata/presto/heapdump
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-Xloggc:/bigdata/fgdata/logs/presto/gc.log
EOF
# 5. 配置node.properties
cat > /bigdata/app/presto/etc/node.properties << ‘EOF’
node.environment=production
node.id=fgedu-presto-coordinator-01
node.data-dir=/bigdata/fgdata/presto
EOF
# 6. 创建catalog目录
mkdir -p /bigdata/app/presto/etc/catalog
# 7. 启动Presto
/bigdata/app/presto/bin/launcher start
# 8. 查看状态
/bigdata/app/presto/bin/launcher status
ps aux | grep presto
# 9. 查看日志
tail -f /bigdata/fgdata/presto/var/log/server.log
# 10. 配置Worker节点
# 在Worker节点上重复1-6步骤
# 修改config.properties:coordinator=false
# 修改node.properties中的node.id
# discovery.uri指向Coordinator
# 11. 下载Presto CLI
wget https://repo1.maven.org/maven2/com/facebook/presto/presto-cli/0.285/presto-cli-0.285-executable.jar
mv presto-cli-0.285-executable.jar presto
chmod +x presto
# 12. 测试连接
./presto –server fgedu-presto-coordinator:8080
presto> show catalogs;
3.2 Hive连接器配置
3.2.1 配置Hive连接器
cat > /bigdata/app/presto/etc/catalog/hive.properties << ‘EOF’
connector.name=hive-hadoop2
hive.metastore.uri=thrift://fgedu-hive-metastore:9083
hive.config.resources=/bigdata/app/hadoop/etc/hadoop/core-site.xml,/bigdata/app/hadoop/etc/hadoop/hdfs-site.xml
hive.parquet.use-column-names=true
hive.parquet.fail-on-corrupted-statistics=false
hive.s3select-pushdown.enabled=true
EOF
# 复制Hadoop配置文件
cp /bigdata/app/hadoop/etc/hadoop/core-site.xml /bigdata/app/presto/etc/
cp /bigdata/app/hadoop/etc/hadoop/hdfs-site.xml /bigdata/app/presto/etc/
# 重启Presto
/bigdata/app/presto/bin/launcher restart
# 测试Hive连接器
./presto –server fgedu-presto-coordinator:8080 –catalog hive
presto> show schemas;
presto> use default;
presto> show tables;
presto> select * from fgedu_test_table limit 10;
# 性能优化配置
# 在hive.properties中添加
hive.max-partitions-per-scan=100000
hive.max-split-size=64MB
hive.hadoop2.metastore-timeout=60s
hive.recursive-directories=true
3.3 Hudi/Iceberg连接器配置
3.3.1 配置Hudi连接器
cat > /bigdata/app/presto/etc/catalog/hudi.properties << ‘EOF’
connector.name=hudi
hive.metastore.uri=thrift://fgedu-hive-metastore:9083
hive.config.resources=/bigdata/app/hadoop/etc/hadoop/core-site.xml,/bigdata/app/hadoop/etc/hadoop/hdfs-site.xml
EOF
# 配置Iceberg连接器
cat > /bigdata/app/presto/etc/catalog/iceberg.properties << ‘EOF’
connector.name=iceberg
hive.metastore.uri=thrift://fgedu-hive-metastore:9083
iceberg.file-format=PARQUET
iceberg.compression-codec=GZIP
EOF
# 重启Presto
/bigdata/app/presto/bin/launcher restart
# 查询Hudi表
./presto –server fgedu-presto-coordinator:8080 –catalog hudi
presto> show schemas;
presto> use default;
presto> show tables;
presto> select * from fgedu_hudi_table limit 10;
# 查询Iceberg表
./presto –server fgedu-presto-coordinator:8080 –catalog iceberg
presto> select * from fgedu_iceberg_table limit 10;
presto> select * from fgedu_iceberg_table for version as of timestamp TIMESTAMP ‘2024-04-01 00:00:00’;
Part04-生产案例与实战讲解
4.1 Presto SQL查询实战
4.1.1 基础SQL查询
./presto –server fgedu-presto-coordinator:8080
# 查看Catalog
presto> show catalogs;
Catalog
———
hive
hudi
iceberg
mysql
system
(5 rows)
# 使用Hive Catalog
presto> use hive.default;
# 查看表
presto> show tables;
Table
——————-
fgedu_user
fgedu_order
fgedu_product
(3 rows)
# 基础查询
presto> select count(*) from fgedu_user;
_col0
———
1000000
(1 row)
# 过滤查询
presto> select user_id, name, age, city
from fgedu_user
where city = ‘北京’
limit 10;
# 聚合查询
presto> select city, count(*) as user_count, avg(age) as avg_age
from fgedu_user
group by city
order by user_count desc
limit 10;
# Join查询
presto> select u.user_id, u.name, o.order_id, o.amount
from fgedu_user u
join fgedu_order o on u.user_id = o.user_id
where u.city = ‘北京’
limit 100;
# 时间范围查询
presto> select dt, count(*) as order_count, sum(amount) as total_amount
from fgedu_order
where dt between ‘2024-04-01’ and ‘2024-04-07’
group by dt
order by dt;
# 联邦查询(跨Catalog)
presto> select h.user_id, h.name, m.phone
from hive.default.fgedu_user h
join mysql.fgedu.user_profile m on h.user_id = m.user_id
limit 10;
4.2 Presto性能优化实战
4.2.1 查询优化技巧
# 不推荐
select * from fgedu_order where substr(dt, 1, 7) = ‘2024-04’;
# 推荐
select * from fgedu_order where dt between ‘2024-04-01’ and ‘2024-04-30’;
# 优化2:小表前置
# 不推荐
select * from big_table a join small_table b on a.id = b.id;
# 推荐
select * from small_table b join big_table a on a.id = b.id;
# 优化3:使用LIMIT
select * from fgedu_order limit 1000;
# 优化4:只查询需要的列
# 不推荐
select * from fgedu_user;
# 推荐
select user_id, name, age from fgedu_user;
# 优化5:使用EXPLAIN查看执行计划
presto> explain select * from fgedu_user where city = ‘北京’;
# 优化6:配置会话属性
presto> set session query_max_memory = ’20GB’;
presto> set session task_concurrency = 16;
presto> set session optimizer_join_distribution_type = ‘AUTOMATIC’;
# 优化7:资源组配置
# etc/resource-groups.json
{
“rootGroups”: [
{
“name”: “global”,
“softMemoryLimit”: “80%”,
“hardConcurrencyLimit”: 100,
“maxQueued”: 1000,
“schedulingPolicy”: “fair”,
“subGroups”: [
{
“name”: “admin”,
“softMemoryLimit”: “20%”,
“hardConcurrencyLimit”: 10,
“maxQueued”: 100,
“schedulingWeight”: 10
},
{
“name”: “user”,
“softMemoryLimit”: “60%”,
“hardConcurrencyLimit”: 50,
“maxQueued”: 500,
“schedulingWeight”: 1
}
]
}
]
}
4.3 Presto监控与运维
4.3.1 Web UI监控
http://fgedu-presto-coordinator:8080
# 主要监控页面
– 首页:集群概览、Running Queries、Completed Queries
– 查询详情:SQL、执行计划、性能指标
– Worker列表:Worker节点状态
– 性能指标:CPU、内存、IO
# Prometheus监控
# 配置etc/config.properties
jmx.rmiregistry.port=9080
jmx.server.port=9081
# 使用jmx_exporter
wget https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/0.19.0/jmx_prometheus_javaagent-0.19.0.jar
# 修改jvm.config
-javaagent:/bigdata/app/jmx_prometheus_javaagent-0.19.0.jar=9404:/bigdata/app/presto/etc/jmx_exporter.yaml
# 配置Prometheus
scrape_configs:
– job_name: ‘presto’
static_configs:
– targets: [‘fgedu-presto-coordinator:9404’, ‘fgedu-presto-worker-01:9404’]
# Grafana Dashboard
# 导入Presto Dashboard
# 关键指标:
– 查询数量(QPS)
– 查询延迟
– 失败查询数
– Worker节点状态
– 内存使用
– CPU使用
Part05-风哥经验总结与分享
5.1 Presto生产最佳实践
Presto生产最佳实践:
- 数据格式:使用Parquet/ORC列式存储
- 分区设计:合理设计分区,避免小文件
- 查询优化:使用分区过滤、小表前置
- 资源隔离:配置资源组,防止大查询占用所有资源
- 监控告警:实时监控查询状态和性能
- 定期运维:清理历史查询、清理日志
5.2 常见问题处理
– 减少查询数据量
– 增加query.max-memory配置
– 使用资源组限制
– 优化SQL
# 常见问题2:查询慢
– 检查是否使用分区过滤
– 检查表统计信息
– 增加Worker节点
– 优化执行计划
# 常见问题3:连接超时
– 增加hive.hadoop2.metastore-timeout
– 检查网络连接
– 检查Metastore服务状态
# 常见问题4:Worker节点掉线
– 检查Worker日志
– 检查资源使用
– 检查网络稳定性
– 增加JVM内存
# 常见问题5:数据不一致
– 检查Hive Metastore同步
– 检查数据格式兼容性
– 刷新元数据:CALL system.sync_partition_metadata(‘schema’, ‘table’, ‘FULL’)
5.3 运维检查清单
– [ ] Coordinator节点状态
– [ ] Worker节点状态
– [ ] 查询队列状态
– [ ] 失败查询监控
– [ ] 查询延迟监控
– [ ] 内存使用情况
– [ ] CPU使用情况
– [ ] 磁盘使用情况
– [ ] 网络带宽使用
– [ ] GC频率和耗时
– [ ] 日志文件检查
– [ ] 元数据同步状态
– [ ] HDFS连接状态
– [ ] 告警规则检查
# 日常巡检内容
1. 检查Web UI集群状态
2. 查看失败查询
3. 检查慢查询
4. 检查Worker节点状态
5. 检查资源使用
6. 查看错误日志
7. 检查HDFS空间
8. 检查备份状态
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
