1. 首页 > Hadoop教程 > 正文

大数据教程FG153-Hadoop即席查询Presto集成实战

本文详细介绍Presto即席查询引擎与Hadoop生态的集成实战,包括Presto概述、架构原理、集群部署、连接器配置、SQL查询、性能优化等内容,风哥教程参考Presto官方文档Getting Started、Deployment、Connectors等内容,适合大数据工程师使用。学习交流加群风哥QQ113257174

Part01-基础概念与理论知识

1.1 Presto概述与核心特性

Presto是一个开源的分布式SQL查询引擎,专门用于快速查询大数据集。它可以查询HDFS、Hive、HBase、关系型数据库等多种数据源。更多视频教程www.fgedu.net.cn

Presto核心特性:

  • 即席查询:交互式SQL查询
  • 高性能:内存计算,比Hive快10-100倍
  • 多数据源:支持Hive、HBase、MySQL、PostgreSQL等
  • 标准SQL:支持ANSI SQL
  • 可扩展:分布式架构,线性扩展
  • 企业级:安全认证、权限控制

1.2 Presto架构与工作原理

Presto采用主从架构,包含Coordinator和Worker两种节点:

# Presto架构组件
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:查询数据湖表
风哥提示:Presto的优势在于联邦查询,可以同时查询多个数据源。但要注意跨数据源join的性能问题。更多学习教程公众号风哥教程itpux_com

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核心配置建议:

# config.properties
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

# 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连接器

# 配置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连接器

# 配置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’;

风哥提示:连接器配置是Presto的关键。配置时要注意Hadoop版本兼容性,建议使用Presto官方推荐的版本。学习交流加群风哥微信: itpux-com

Part04-生产案例与实战讲解

4.1 Presto SQL查询实战

4.1.1 基础SQL查询

# 启动Presto CLI
./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 查询优化技巧

# 优化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监控

# 访问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使用

生产环境建议:Presto Web UI是重要的监控工具,建议配置访问权限控制。同时配置Prometheus+Grafana进行长期监控和告警。更多视频教程www.fgedu.net.cn

Part05-风哥经验总结与分享

5.1 Presto生产最佳实践

Presto生产最佳实践:

  • 数据格式:使用Parquet/ORC列式存储
  • 分区设计:合理设计分区,避免小文件
  • 查询优化:使用分区过滤、小表前置
  • 资源隔离:配置资源组,防止大查询占用所有资源
  • 监控告警:实时监控查询状态和性能
  • 定期运维:清理历史查询、清理日志

5.2 常见问题处理

# 常见问题1:查询OOM
– 减少查询数据量
– 增加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 运维检查清单

# Presto运维检查清单
– [ ] Coordinator节点状态
– [ ] Worker节点状态
– [ ] 查询队列状态
– [ ] 失败查询监控
– [ ] 查询延迟监控
– [ ] 内存使用情况
– [ ] CPU使用情况
– [ ] 磁盘使用情况
– [ ] 网络带宽使用
– [ ] GC频率和耗时
– [ ] 日志文件检查
– [ ] 元数据同步状态
– [ ] HDFS连接状态
– [ ] 告警规则检查

# 日常巡检内容
1. 检查Web UI集群状态
2. 查看失败查询
3. 检查慢查询
4. 检查Worker节点状态
5. 检查资源使用
6. 查看错误日志
7. 检查HDFS空间
8. 检查备份状态

风哥提示:Presto是一个强大的即席查询引擎,但要注意合理使用。避免在Presto中运行非常大的批处理任务,那应该用Hive或Spark。学习交流加群风哥QQ113257174

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

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

微信号:itpux-com

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