Impala队列内存参数分析
问题
对Impala队列内存的几个参数分析了下,欢迎指正
队列资源池的几个内存配置
Maximum Query Memory Limit
某个队列资源池,一个查询在一个Impala节点上下执行需要的最小内存
Minimum Query Memory Limit
某个队列资源池,一个查询在一个Impala节点上下执行需要的最大内存
最大内存
可用于此池中执行的所有查询的最大内存
给一个Impala队列提交查询时,Impala如何判断是否接受查询请求
实验sql
set request_pool = hqueue;
select tally_id, acctset_code from testtable where acctset_code='00001'order by acctset_code limit 5 offset 5;
查询sql分析
[ip:21000] testdb> explain select tally_id, acctset_code from testtable where acctset_code='00001'order by acctset_code limit 5 offset 5;
Query: explain select tally_id, acctset_code from testtable where acctset_code='00001'order by acctset_code limit 5 offset 5
+------------------------------------------------------------------------------------+
| Explain String |
+------------------------------------------------------------------------------------+
| Max Per-Host Resource Reservation: Memory=8.00MB Threads=3 |
| Per-Host Resource Estimates: Memory=256MB |
| WARNING: The following tables are missing relevant table and/or column statistics. |
| testdb.testtable |
| |
| PLAN-ROOT SINK |
| | |
| 02:MERGING-EXCHANGE [UNPARTITIONED] |
| | offset: 5 |
| | order by: acctset_code ASC |
| | limit: 5 |
| | |
| 01:TOP-N [LIMIT=10] |
| | order by: acctset_code ASC |
| | row-size=22B cardinality=10 |
| | |
| 00:SCAN HDFS [testdb.testtable] |
| partitions=138/138 files=140 size=808.62MB |
| predicates: acctset_code = '00001' |
| row-size=22B cardinality=16 |
+------------------------------------------------------------------------------------+
注意的地方:这里面有个单节点需要内存值256M,不过Impala估算的不一定准确。
实验1
| Left-Aligned | Left-Aligned | Left-Aligned | Left-Aligned |
|---|---|---|---|
| 队列名称 | 最大内存 | Minimum Query Memory Limit | Maximum Query Memory Limit |
| root.hqueue | 500M | 260M | 270M |
提交结果:
[ip:21000] testdb> select tally_id, acctset_code from testtable where acctset_code='00001'order by acctset_code limit 5 offset 5;
Query: select tally_id, acctset_code from testtable where acctset_code='00001'order by acctset_code limit 5 offset 5
Query submitted at: 2020-06-23 10:54:55 (Coordinator: http://ip:25000)
Query progress can be monitored at: http://ip:25000/query_plan?query_id=f54d764cf100d474:a89eec5c00000000
ERROR: Rejected query from pool root.hqueue: request memory needed 780.00 MB is greater than pool max mem resources 500.00 MB.
猜测是因为:260M(查询最小内存) * 3 =780M > 500M
实验2
| Left-Aligned | Left-Aligned | Left-Aligned | Left-Aligned |
|---|---|---|---|
| 队列名称 | 最大内存 | Minimum Query Memory Limit | Maxmum Query Memory Limit |
| root.hqueue | 500M | 250M | 270M |
提交结果:
[ip:21000] testdb> select tally_id, acctset_code from testtable where acctset_code='00001'order by acctset_code limit 5 offset 5;
Query: select tally_id, acctset_code from testtable where acctset_code='00001'order by acctset_code limit 5 offset 5
Query submitted at: 2020-06-23 10:58:28 (Coordinator: http://ip:25000)
Query progress can be monitored at: http://ip:25000/query_plan?query_id=39423b17b20dc603:66c4de7400000000
ERROR: Rejected query from pool root.hqueue: request memory needed 768.23 MB is greater than pool max mem resources 500.00 MB.
猜测是因为:256M(查询计划里面估计的单节点内存) * 3 = 768M > 500M,综合实验1和实验2,估计Impala在判断查询是否会超内存时,对估计值和Minimum Query Memory Limit参数,会有个 Max(估计值,Minimum Query Memory Limit)操作,在实验1中,即Max(256M,260M),实验2中,即Max(256,250)。
实验3
| Left-Aligned | Left-Aligned | Left-Aligned | Left-Aligned |
|---|---|---|---|
| 队列名称 | 最大内存 | Minimum Query Memory Limit | Maxmum Query Memory Limit |
| root.hqueue | 500M | 250M | 252M |
提交结果:
[ip:21000] testdb> select tally_id, acctset_code from testtable where acctset_code='00001'order by acctset_code limit 5 offset 5;
Query: select tally_id, acctset_code from testtable where acctset_code='00001'order by acctset_code limit 5 offset 5
Query submitted at: 2020-06-23 11:09:42 (Coordinator: http://ip:25000)
Query progress can be monitored at: http://ip:25000/query_plan?query_id=e24e74d387c201b5:9e72143600000000
ERROR: Rejected query from pool root.hqueue: request memory needed 756.00 MB is greater than pool max mem resources 500.00 MB
猜测是因为:252M * 3 = 756M > 500M,结合实验2,估计Impala在判断查询是否会超内存时,对于Maxmum Query Memory Limit参数,会有个Min操作,即Min(Max(估计值,Minimum Query Memory Limit),Maxmum Query Memory Limit),在本例中,即Min(Max(256M,250M),252M)
实验4
mem_limit:指定查询每个节点需要的内存
| Left-Aligned | Left-Aligned | Left-Aligned | Left-Aligned |
|---|---|---|---|
| 队列名称 | 最大内存 | Minimum Query Memory Limit | Maxmum Query Memory Limit |
| root.hqueue | 500M | 100M | 200M |
[ip:21000] testdb> set mem_limit=170M;
MEM_LIMIT set to 170M
[ip:21000] testdb> select tally_id, acctset_code from testtable where acctset_code='00001'order by acctset_code limit 5 offset 5;
Query: select tally_id, acctset_code from testtable where acctset_code='00001'order by acctset_code limit 5 offset 5
Query submitted at: 2020-06-23 13:53:31 (Coordinator: http://ip:25000)
Query progress can be monitored at: http://ip:25000/query_plan?query_id=ba4fa4a44d2dac9d:b24a60d600000000
ERROR: Rejected query from pool root.hqueue: request memory needed 510.00 MB is greater than pool max mem resources 500.00 MB.
[ip:21000] testdb> set mem_limit=210M;
MEM_LIMIT set to 210M
[ip:21000] testdb> select tally_id, acctset_code from testtable where acctset_code='00001'order by acctset_code limit 5 offset 5;
Query: select tally_id, acctset_code from testtable where acctset_code='00001'order by acctset_code limit 5 offset 5
Query submitted at: 2020-06-23 13:54:07 (Coordinator: http://ip:25000)
Query progress can be monitored at: http://ip:25000/query_plan?query_id=ca49acba3c002727:2d69557a00000000
ERROR: Rejected query from pool root.hqueue: request memory needed 600.00 MB is greater than pool max mem resources 500.00 MB
分析:mem_limit=170M时,Min(Max(170,100),200) * 3 = 510M > 500M;mem_limit=210M时,Min(Max(210,100),200) * 3 = 600M > 500;猜测,指定mem_limit时,Impala会使用mem_limit值来代替自己估计的内存使用值,并结合Minimum Query Memory Limit和Maxmum Query Memory Limit来判断内存是否会超过最大内存,从而决定是否拒绝查询请求。
实验5
| Left-Aligned | Left-Aligned | Left-Aligned | Left-Aligned |
|---|---|---|---|
| 队列名称 | 最大内存 | Minimum Query Memory Limit | Maxmum Query Memory Limit |
| root.hqueue | 500M | 39M | 39M |
[ip:21000] testdb> select tally_id, acctset_code from testtable where acctset_code='00001'order by acctset_code limit 5 offset 5;
Query: select tally_id, acctset_code from testtable where acctset_code='00001'order by acctset_code limit 5 offset 5
Query submitted at: 2020-06-23 15:26:42 (Coordinator: http://ip:25000)
Query progress can be monitored at: http://ip:25000/query_plan?query_id=234ca270d3731d06:9980e6fd00000000
ERROR: Rejected query from pool root.hqueue: minimum memory reservation is greater than memory available to the query for buffer reservations. Memory reservation needed given the current plan: 8.00 MB. Adjust either the mem_limit or the pool config (max-query-mem-limit, min-query-mem-limit) for the query to allow the query memory limit to be at least 40.00 MB. Note that changing the mem_limit may also change the plan. See the query profile for more information about the per-node memory requirements.
以下配置,查询成功提交并执行
| Left-Aligned | Left-Aligned | Left-Aligned | Left-Aligned |
|---|---|---|---|
| 队列名称 | 最大内存 | Minimum Query Memory Limit | Maxmum Query Memory Limit |
| root.hqueue | 500M | 40M | 40M |
分析:max-query-mem-limit, min-query-mem-limit,不能设置的太小,测试环境中,单个节点最少需要40M
结论
当查询指定mem_limit,以下条件拒绝提交查询,报内存不够
__Min(Max(mem_limit,Minimum Query Memory Limit),Maxmum Query Memory Limit) * 节点数 __> 最大内存
未指定mem_limit,以下条件拒绝提交查询,报内存不够,估计值可以通过explain获得,不过Impala估计的不准
__Min(Max(估计值,Minimum Query Memory Limit),Maxmum Query Memory Limit) * 节点数 __> 最大内存
max-query-mem-limit, min-query-mem-limit,不能设置的太小,测试环境中,单个节点最少需要40M
建议
- 配置Maxmum Query Memory Limit * 节点数 <= 最大内存,查询应该不会被reject
- 若队列资源池中没有配置Minimum Query Memory Limit和Maxmum Query Memory Limit参数,那么从之前的结论也可以看出,Impala会根据__估计值 * 节点数__ 是否大于最大内存来判断是否拒绝该查询,但因为Impala估计出的单节点内存上限值很不准确,所以这种情况,可以通过 set mem_limit = XXM,人为设置一个合理的大小,后续Impala会根据__mem_limit__ * 节点数来判断是否会超过最大内存
Impala队列内存参数分析的更多相关文章
- JVM内存结构、参数调优和内存泄露分析
1. JVM内存区域和参数配置 1.1 JVM内存结构 Java堆(Heap) Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建.此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都 ...
- jvm内存溢出分析
概述 jvm中除了程序计数器,其他的区域都有可能会发生内存溢出 内存溢出是什么? 当程序需要申请内存的时候,由于没有足够的内存,此时就会抛出OutOfMemoryError,这就是内存溢出 内存溢出和 ...
- 消息队列NetMQ 原理分析4-Socket、Session、Option和Pipe
消息队列NetMQ 原理分析4-Socket.Session.Option和Pipe 前言 介绍 目的 Socket 接口实现 内部结构 Session Option Pipe YPipe Msg Y ...
- 细说并发5:Java 阻塞队列源码分析(下)
上一篇 细说并发4:Java 阻塞队列源码分析(上) 我们了解了 ArrayBlockingQueue, LinkedBlockingQueue 和 PriorityBlockingQueue,这篇文 ...
- .NET内存性能分析宝典
.NET Memory Performance Analysis 知道什么时候该担心,以及在需要担心的时候该怎么做 译者注 **作者信息:Maoni Stephens ** - 微软架构师,负责.NE ...
- 转: 关于Linux与JVM的内存关系分析
转自: http://tech.meituan.com/linux-jvm-memory.html Linux与JVM的内存关系分析 葛吒2014-08-29 10:00 引言 在一些物理内存为8g的 ...
- Linux TCP队列相关参数的总结 转
在Linux上做网络应用的性能优化时,一般都会对TCP相关的内核参数进行调节,特别是和缓冲.队列有关的参数.网上搜到的文章会告诉你需要修改哪些参数,但我们经常是知其然而不知其所以然,每次照抄过 ...
- Android内存机制分析1——了解Android堆和栈
//----------------------------------------------------------------------------------- Android内存机制分析1 ...
- Android 内存管理分析(四)
尊重原创作者,转载请注明出处: http://blog.csdn.net/gemmem/article/details/8920039 最近在网上看了不少Android内存管理方面的博文,但是文章大多 ...
随机推荐
- Bugku-cms1
一.先用御剑扫描 二.点击第一个目录,发现sql文件 三.把它载下来,用Notepad++打开.发现管理员的账号和密码(admin的密码好像被人改了,然后我用admin888登的后台) 四.后台地址 ...
- [原题复现]2019强网杯WEB-随便注(多种方法)
简介 原题复现:https://gitee.com/xiaohua1998/qwb_2019_supersqli 考察知识点:SQL注入漏洞-堆叠注入 线上平台:https://buuoj.cn( ...
- Guitar Pro吉他指弹入门——特殊调弦
本期文章中,我们将通过吉他打谱软件Guitar Pro 7来向大家讲解指弹曲目中所涉及的特殊调弦. 作为一个吉他手,在练琴的时候总会遇到各种各样的问题,比如说鼓手不肯跟你合作(因为打鼓往往不能露脸), ...
- request封装
request封装 import requests class RequestsHandler: def __init__(self): self.session = requests.Session ...
- zabbix的搭建及操作(4)实现邮件,钉钉,微信报警
实现邮件报警 网页版邮箱中开启 POP3/SMTP/IMAP 生成授权码并记录 Server端安装配置邮件服务器 1.Yum安装邮件服务器 yum -y install mailx dos2unix ...
- Linux安装禅道教程
环境: centos7 64位 禅道11.2 Linux一键安装包64位 下载: 禅道下载地址: http://dl.cnezsoft.com/zentao/11.2/ZenTaoPMS.11.2.s ...
- Codeforces Round #668 (Div. 2) D. Tree Tag 题解(博弈)
题目链接 题目大意 给你一颗树,Alice在a点,Bob在b点,Alice最多走da步,Bob最多走db步,两人轮流走路.要你判断经过无数次追赶后,Alice是否可以追上Bob,两人进行的都是最优策略 ...
- Java基础教程——System类
System类 java.lang.System类代表当前Java程序的运行平台. |-可以做输入输出,垃圾回收:(此处不讲) |-可以获取时间: |-可以获取环境变量: |-可以获取系统信息: |- ...
- 【坑爹的mybtis plus】wrapper.in击垮了我们的数据库!
mybatis plus让我们从很大程度上实现了用"java去写sql",但是有些很隐晦的使用方式,如果不注意的话,也会引起错误: 如果.in的时候给了一个null,这个时候并不会 ...
- Python爬虫入门(二)之Requests库
Python爬虫入门(二)之Requests库 我是照着小白教程做的,所以该篇是更小白教程hhhhhhhh 一.Requests库的简介 Requests 唯一的一个非转基因的 Python HTTP ...