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内存管理方面的博文,但是文章大多 ...
随机推荐
- Pinpoint 更改agentid 和 agent name 长度限制(Pinpoint系列二)
本文基于 Pinpoint 2.1.0 版本 本文的内容为了更改 ID 和 Name 长度限制,因为有使用容器或者是服务名称确实比较长,所以根据业务场景,我们需要更改源码来实现这个. 具体更改,参考 ...
- 阿里面试官:小伙子,你给我说一下Spring Bean初始化的几种常规方式吧
前言 通过构造方法实例化通过静态工厂实例化通过实例工厂实例化通过FactoryBean实例化 RumenzA实体类 package com.rumenz; public class RumenzA { ...
- Appium上下文和H5测试(一)
坚持原创输出,点击蓝字关注我吧 作者:清菡 博客:oschina.云+社区.知乎等各大平台都有. 目录 一.混合应用-H5 1.混合应用是什么? 2.怎么样分辨一个 App 页面究竟是原生的还是 We ...
- 【性能测试】【locust】场景性能测试步骤
场景设计 实现登陆基本功能,输出相应结果,脚本通 多用户实现随机登陆 添加初始化方法on_start: 每个用户只运行一次 添加检查点: catch_responses = True 脚本设计 # 导 ...
- 模拟赛41 A. 四个质数的和
题目描述 给定了一个正整数 \(N\).有多少种方法将 \(N\) 分解成为四个质数 \(a,b,c,d\)的和. 例如: \(9=2+2+2+3=2+2+3+2=2+3+2+2=3+2+2+2\), ...
- Codeforces Round #488 by NEAR (Div. 2)
A 开个桶记录是否出现即可. 时间复杂度 \(O\left(n+m\right)\). B 按能力值从小到大依次加入,然后维护前 \(k\) 大的金币数即可. 时间复杂度 \(O\left(n\log ...
- [Python]环境配置之pip加速
背景 学习 Python 的话,仅掌握标准库是远不够的,有很多好用的第三方库我们也需要用到的,比如,由鼎鼎大名的 K 神开发的爬虫必不可少的 requests 库,一般都是必装的库吧.安装第三方库当然 ...
- finalize和clean
弊端 1.执行的时间不确定,资源释放不能靠这2个方法.Cleaner规范指出:"清除方法在System.exit期间的行为是与实现相关的.不确保清除动作是否会被调用." 2#.如果 ...
- Elements-of-Python_02_DataType
(内容包括数据类型,运算符) 1.数据类型Data Types 1.1 简介Brief Introduction Python3中的数据类型,类型关键字,赋值,见下表: 1.1数字Number Pyt ...
- js中定时器调用函数时为什么会有引号
之前在学习的时候并没有发现的细节,关于js中,定时器的问题 这里我们写两个延时器 setTimeout(func, 0); setTimeout("func()", 0);定时器中 ...