Presto性能调优的五大技巧
1 Presto性能调优
1.1 概述
1.1.1 Presto架构
图1-1 Presto架构
Presto是一个分布式的查询引擎,本身并不存储数据,但是可以接入多种数据源,并且支持跨数据源的级联查询。
Presto的架构分为:
Coodinator:解析SQL语句,生成执行计划,分发执行任务给Worker节点执行。
Discovery Server:Worker节点启动后向Discovery Server服务注册,Coordinator从Discovery Server获得可以正常工作的Worker节点。
Worker:负责执行实际查询任务,访问底层存储系统。
存储:Presto的数据可以存储在HDFS/OBS,推荐热数据存储在HDFS,冷数据存储在OBS。
1.2 内存调优
1.2.1 内存管理原理
Presto有三种内存池,分别为GENERAL_POOL、RESERVED_POOL、SYSTEM_POOL。
GENERAL_POOL:用于普通查询的physical operators。GENERAL_POOL值为 总内存(Xmx值)- 预留的(max-memory-per-node)- 系统的(0.4 * Xmx)。
SYSTEM_POOL:系统预留内存,用于读写buffer,worker初始化以及执行任务必要的内存。大小由config.properties里的resources.reserved-system-memory指定。默认值为JVM max memory * 0.4。
RESERVED_POOL:大部分时间里是不参与计算的,只有当同时满足如下情形下,才会被使用,然后从所有查询里获取占用内存最大的那个查询,然后将该查询放到 RESERVED_POOL 里执行,同时注意RESERVED_POOL只能用于一个Query。大小由config.properties里的query.max-memory-per-node指定,默认值为:JVM max memory * 0.1。
GENERAL_POOL有节点出现阻塞节点(block node)情况,即该node内存不足。
RESERVED_POOL没有被使用
l query.max-memory:表示单个查询在分布在所有相关节点上能用的内存之和的最大值。
l query.max-memory-per-node:表示单个查询在单个节点上用户内存能用的最大值。
l query.max-total-memory-per-node:表示单个查询在单个节点上用户内存能用的最大值和系统内存量。其中系统内存是读取器、写入器和网络缓冲区等在执行期间使用的内存。
l memory.heap-headroom-per-node:这个内存主要是第三方库的内存分配,无法被统计跟踪,默认值是-Xmx * 0.3。
注意点:
query.max-memory-per-node小于query.max-total-memory-per-node。
query.max-total-memory-per-node 与memory.heap-headroom-per-node 之和必须小于 jvm max memory 也就是jvm.config 中配置的-Xmx。
图1-2 Presto内存池
图1-3 Presto内存配置
1.2.2 内存调优参数
操作场景
Presto由于是完全基于内存的计算,经常出现OOM,需要调整内存。
修改参数
参数名 |
默认值 |
描述 |
优化建议 |
修改位置 |
query.max-memory-per-node |
jvm * 0.1 |
表示单个查询在单个节点上用户内存能用的最大值 |
jvm * 0.25 |
config.properties |
query.max-total-memory-per-node |
> query.max-memory-per-node |
表示单个查询在单个节点上用户内存能用的最大值和系统内存量。其中系统内存是读取器、写入器和网络缓冲区等在执行期间使用的内存 |
jvm * 0.4 |
config.properties |
memory.heap-headroom-per-node |
jvm * 0.3 |
这个内存主要是第三方库的内存分配,无法被统计跟踪 |
jvm * 0.2 |
config.properties |
query.max-memory |
< query.max-memory-per-node * worker |
表示单个查询在分布在所有相关节点上能用的内存之和的最大值 |
query.max-memory-per-node * worker * 0.8 |
config.properties |
query.low-memory-killer.policy |
none |
当查询发生OOM时的处理策略。配置total-reservation的作用是kill掉所有查询里最费内存的查询;而total-reservation-on-blocked-nodes杀死在内存不足(阻塞)的节点上使用最多内存的查询 |
total-reservation-on-blocked-nodes |
jvm.config |
experimental.reserved-pool-enabled |
true |
是否启用Reserved Pool |
并发较多时, RESERVED_POOL可能被闲置,可以关闭RESERVED_POOL |
config.properties |
1.2.3 常见OOM报错
1.2.3.1 Query exceeded per-node total memory limit of xx
适当增加query.max-total-memory-per-node。
1.2.3.2 Query exceeded distributed user memory limit of xx
适当增加query.max-memory。
1.2.3.3 Could not communicate with the remote task. The node may have crashed or be under too much load
内存不够,导致节点crash,可以查看/var/log/message。
1.3 并行度
操作场景
调整线程数增大task的并发以提高效率。
修改参数
参数名 |
默认值 |
描述 |
优化建议 |
修改位置 |
task.concurrency |
16 |
执行join,aggregation等操作的并发度 |
串行调高并行调低 |
config.properties |
task.max-worker-threads |
cpu core * 2 |
worker处理split的线程数 |
如果工作器CPU利用率低并且所有线程都在使用中,则增加此数目可以提高吞吐量,但是会导致堆空间使用率增加。将该值设置得太高可能会由于上下文切换而导致性能下降。线程数可通过com.facebook.presto.execution.executor:name = TaskExecutor.RunningSplits JXM对象的RunningSplits属性获得 |
config.properties |
node-scheduler.max-splits-per-node |
100 |
每个worker上处理的split数 |
单个split处理时间短时调大 |
config.properties |
1.4 元数据缓存
操作场景
Presto支持Hive connector,元数据存储在Hive metastore中,调整元数据缓存的相关参数可以提高访问元数据的效率。
修改参数
参数名 |
默认值 |
描述 |
优化建议 |
修改位置 |
hive.metastore-cache-ttl |
Time to live Hive metadata cache |
1440s |
catalog/hive.properties |
|
hive.metastore-refresh-interval |
How often to refresh the Hive metastore cache |
1h |
catalog/hive.properties |
|
hive.metastore-cache-maximum-size |
Hive metastore cache maximum size |
10000 |
catalog/hive.properties |
|
hive.metastore-refresh-max-threads |
Maximum number of threads to refresh Hive metastore cache. |
100 |
catalog/hive.properties |
1.5 Hash优化
操作场景
针对Hash场景的优化。
修改参数
参数名 |
默认值 |
描述 |
优化建议 |
修改位置 |
query.initial-hash-partitions |
8, If the value is larger than the number of machines available during query scheduling, Presto will use all available machines |
当分区系统设置为FIXED时,此值用于确定可以有多少个节点共享同一查询 |
Value lower then number of presto nodes may lower the utilization of cluster in low traffic environment. Setting the number to to high value will cause assigning multiple partitions of same query to one node or ignoring the setting - in some configurations the value is internally capped at number of available worker nodes |
config.properties |
optimizer.optimize-hash-generation |
Compute hash codes for distribution, joins, and aggregations early in query plan which may allow to drop some of computation later in query processing with the cost of increased preprocessing. In most cases it should decrease overall query processing time |
true |
config.properties |
1.6 优化OBS相关参数
操作场景
Presto支持on OBS,读写OBS过程中可以调整OBS客户端参数来提交读写效率。
修改参数
参数名 |
默认值 |
描述 |
优化建议 |
修改位置 |
fs.obs.readahead.range |
读数据时,发起预读建立range读的请求大小 |
4194304 |
core-site.xml |
|
fs.obs.write.buffer.size |
OBS FS中的读写缓冲区大小 |
262144 |
core-site.xml |
|
fs.obs.read.buffer.size |
OBS FS中的读写缓冲区大小 |
262144 |
core-site.xml |
点击这里→了解更多精彩内容
相关阅读:
数据湖应用解析:Spark on Elasticsearch一致性问题
Presto性能调优的五大技巧相关推荐
- java 分布式sql引擎_分布式SQL查询引擎 Presto 性能调优的五大技巧
概述 Presto架构 Presto是一个分布式的查询引擎,本身并不存储数据,但是可以接入多种数据源,并且支持跨数据源的级联查询. Presto的架构分为: Coodinator:解析SQL语句,生成 ...
- 【Python】这10个Python性能调优的小技巧,你知道几个?
这篇文章关于Python性能调优的10个小技巧,每天花5-10分钟阅读我的文章,对你技术提升一定会有帮助. 1 多多使用列表生成式 替换下面代码: cube_numbers = []for n in ...
- Spark+Alluxio性能调优十大技巧
戳蓝字"CSDN云计算"关注我们哦! 由于统一访问对象存储(如S3)和HDFS数据的场景的出现和普及,Apache Spark结合Alluxio的大数据栈越来越受欢迎.此外,越来越 ...
- MySQL 性能调优和优化技巧
介绍 MySQL 是一种流行的开源数据库应用程序,它以一种有意义且易于访问的方式存储和构造数据.对于大型应用程序,庞大的数据量可能会导致性能问题. 本指南提供了一些关于如何提高 MySQL 数据库性能 ...
- Java 性能调优的 11 个实用技巧
大多数开发人员理所当然地以为性能优化很复杂,需要大量的经验和知识.好吧,不能说这是完全错误的.优化应用程序以获得最佳性能不是一件容易的事情.但是,这并不意味着如果你不具备这些知识,就不能做任何事情.这 ...
- 9 个 Java 性能调优技巧,YYDS!
来源 | DZone 大多数开发者认为性能优化是一个复杂的话题,它需要大量的工作经验和相关知识理论.好吧,这也不完全错.优化一个应用做到性能最优化可能不是件容易的任务,但是这并不意味着你没有相关的知识 ...
- iOS应用性能调优的25个建议和技巧【转】
转载自:http://blog.jobbole.com/37984/ 首页 最新文章 资讯 程序员 设计 IT技术 创业 在国外 营销 趣文 特别分享 更多 > - Navigation - 首 ...
- java format 补足空格_11个简单的Java性能调优技巧
想要保持程序高效运行?您可以采取一些步骤来消除瓶颈,缓存提示以及其他性能调整建议. 大多数开发人员期望性能优化是一个复杂的主题,需要大量的经验和知识.好的,那不是完全错误的.优化应用程序以获得最佳性能 ...
- 9 个可以快速掌握的 Java 性能调优技巧
大多数开发者认为性能优化是一个复杂的话题,它需要大量的工作经验和相关知识理论.好吧,这也不完全错. 优化一个应用做到性能最优化可能不是件容易的任务,但是这并不意味着你没有相关的知识就什么也做不了.这里 ...
最新文章
- 【高级数据结构】并查集
- python使用curses库获取控制台的键盘输入(如上下左右)
- php协程实现mysql异步_swoole与php协程实现异步非阻塞IO开发
- zigbee工业应用技术
- Linux 安装 OpenOffice
- java常用网络协议_初识java网络编程
- 【JAVA SE】第十章 String类、StringBuffer类和StringBuilder类
- ECMAScript 6学习总结(1)——ECMAScript 6入门简介
- redis 设置密码 和 redis.config文件
- android图片混淆还原,图片混淆还原1.2版本
- 斜齿轮重合度计算公式_齿轮强度校核及重合度计算(已优化)
- GitHub 桌面版 v3.0 新特性「GitHub 热点速览 v.22.18」
- android 广告库sdk,秒针移动广告投放Android SDK集成指南
- 得到app文稿导出_得到-app分析
- 用计算机弹奏七月上,七月上歌词背后的故事 七月上背景故事介绍
- 接收机PPM与SBUS
- 艾洛积分系统(Elo Rating System)
- 【社交网络】映射主题网络:从两极分化的人群到社区集群(二)
- NC文件笔记(2020-09-14)
- FBX直接导入Unity材质丢失为白模
热门文章
- Unicode 属性类
- 2016年广东省电子设计大赛健康电子专题——健康养殖远程监控系统(环境监控系统V1.0版本)
- matlab在activex中读取视频,[转载]matlab读取excel数据并显示在excel(activex控件)中
- java中常见的编译错误的是_编译时JAVA最常见的错误有哪些
- 黑苹果_黑苹果扯犊子篇
- sql server ssl安全错误_渗透测试 丨 SQL注入的攻与防
- Vue.JS学习笔记
- C++中字符数组和字符串string
- ubuntu-kylin16.04搭建lamp环境。
- C#调用Java方法(详细实例)