==========================
理解 mem_limit 参数
==========================
set mem_limit=-1b #取消内存限制
set mem_limit=1gb #设置单机内存上限为1GB, 注意是单机
set mem_limit=1mb #设置单机内存上限为1MB, 注意是单机
如果设置了 mem_limit, impala 将跳过Query内存评估环节, 直接检查Pool中剩余内存是否够用, 如果够用的话, 将直接执行. 如果不够用的话, 将按照pool设定的策略, 将Query放到queue队列中, 如果在timeout设定时间内仍得不到足量的内存资源, 该Query将被取消. 如果用户不设置mem_limit, 默认使用Pool的 default_pool_mem_limit 值, 如果default_pool_mem_limit没有设置,Impala会自己来估计这个值. 如果没有设置mem_limit, 否则Impala根据统计信息和执行计划预估内存消耗.

当然, 在运行期间, 如果Query占用的内存超过 mem_limit, impala 将终止该 query,

假设单机设置了10GB的内存上线, 集群有10个节点, 在查询之前, Impala检查Pool 中剩余内存是否够300GB.

Impala pool 级别几个设置参数有:
default_pool_max_queued, 进入等待队列中查询的缺省个数
default_pool_max_requests, 正在执行中的查询个数
default_pool_mem_limit, 为查询设置的默认内存占用上限, 通常通过 disable_pool_mem_limits 参数禁用了该设置.
queue_wait_timeout_ms, 缺省 60000 毫秒, 即1分钟, 查询在队列中最大等待时长, 超过该设定值, 查询就被reject.

手工设置 MEM_LIMIT 参数的必要性
1. 避免Impala的 over-estimation 的不良后果
Impala 在查询执行之前会预测SQL执行会消耗多大内存, 预测主要是依据表的统计信息, 但在很多时候, Impala的预估是很粗放式的, 即使表的统计信息很及时, impala也会over estimate内存消耗. over-estimation 的后果有: (1)预估值如果大于impala pool中的剩余内存, impala 就会reject该查询. (2)降低并发度.
2. 有可能会提升执行速度
手工设定 MEM_LIMIT 参数后, Impala将会跳过内存预测过程, 有可能会加快执行速度.

如何设置 MEM_LIMIT 参数?
先试运行一下SQL, 然后在 profile 中, 查看其 memory_per_node_peak 值, 该值即为实际上的内存消耗, 或者在 impala WebUI该query详细页面的 Summary 页签的 Peak Mem 栏位.

==========================
impala 资源的软隔离
==========================
摘自国双公司的说明: https://blog.csdn.net/qq_18882219/article/details/78447558

由于Impala的每个Impalad节点都可以接受查询,对于每个Pool现在有多少查询,占了多少内存,Queue了多少,这些信息也是每个Impalad更新,通过Statestored来广播到其他Impalad,所以这个信息可能在每个节点上可能是不一致的。当一个Impalad收到查询需要做一些决策例如是否拒绝,是否Queue住,本地的这个决策信息可能是旧的,所以Impala基于Pool的资源隔离本身来说是一种软隔离,也就是说对于任何一个Pool来说,其用到的内存有可能会超过最大内存,运行的查询数量有可能会超过Pool设置的最大查询数量。这个我们在实际的使用中也证明了。软隔离问题会带来两个风险:
1.单个节点申请的内存在某个时刻超过了分配给Impalad进程的内存,这个会导致Impalad OOM退出
2.某个Pool在某一个时刻使用了远远超过这个Pool的资源,这个对于不同业务用Pool来做资源隔离是不利的。
这个问题我们也跟Impala社区的开发者做过讨论,最后使用的方案是:单个Pool指定唯一的Coordinator,这个Pool的所有查询都发送给同一个Impalad。于是这个Coordinator时刻都有这个资源池最新的信息,就从软隔离进化成了硬隔离,缺点是会带来单点问题,可采取了主备的方式来避免这一问题.

==========================
其他几个重要的session 变量
==========================
除了 MEM_LIMIT, 还有如下常用的session 变量
EXPLAIN_LEVEL :设置explain和profile的输出详略
DISABLE_UNSAFE_SPILLS : 是否禁用 disk spill, 目前对disk spill限制还很多, 比如非等值join不能使用 disk spill.
REQUEST_POOL : 设置所在的队列

EXPLAIN_LEVEL 参数可以控制 explain语句的输出, 也可以控制 profile 命令输出. 需要说明的是, explain 可以在SQL客户端中执行, 而profile 命令只能在impala shell中执行, 另外只能展现已经最近执行完毕的那个SQL的profile.
set EXPLAIN_LEVEL = 0 -- 0 or MINIMAL, 因为输出信息较少, 更容易发现主要的信息 比如join的order
set EXPLAIN_LEVEL = 1 -- 1 or STANDARD, 标准的输出
set EXPLAIN_LEVEL = 2 -- 2 or EXTENDED, 详细的输出
set EXPLAIN_LEVEL = 3 # 3 or VERBOSE, 更详细的输出

如果查询速度较差, 可以通过下面命令看看是否缺少统计信息.
set explain_level=3 --verbose 级, 包含更多的细节信息. 在explain输出中, 如果有如下信息, 则对应表没有统计信息.
cardinality: unavailable
table stats: unavailable
column stats: unavailable

==========================
Join reordering
==========================
对于多表Join 查询, 老版的impala总是按照表出现的顺序依次查询, 但新版Impala执行引擎已经可以自动按照的表/列的统计信息, 做Join reordering. 规则是:
大表(表 size和distinct value多的表)先被查询, 小表后被查询
无统计信息的表(impala认为表的size为0)将最后被查询.

==========================
使用 STRAIGHT_JOIN Hint
==========================
当统计信息过期或没有统计信息或者表有很诡异的数据分布, Impala执行计划的查询表顺序很可能不是最优, 这时候, 最好加上 STRAIGHT_JOIN Hint, 强制impala按照SQL中表出现的次序做查询, 当然我们SQL表出现次序应该是精心调整过的.

另外, STRAIGHT_JOIN 仅仅对于当前Select 语句有效, 如果子查询和view也需要严格按照表次序做查询, 需要在子查询和视图中显式地加上 STRAIGHT_JOIN hint, 另外 STRAIGHT_JOIN hint 是impala 的关键词, 不能放在/*+*/中.

select STRAIGHT_JOIN t1.* from t1
join t2 on t1.id=t2.id

select distinct STRAIGHT_JOIN t2.id,t1.name from t1
join t2 on t1.id=t2.id
;

==========================
join 的算法
==========================
1. hash join: 对于等值join, impala将采用hash的方式处理, 具体又分两种策略, broadcast 和 Shuffle.
broadcast join 非常适合右表是小表的情形, impala 先将右表复制到各个节点, 再和左表做join.
shuffle join, 也叫做partitioned join, 适合大表和大表关联. 注意 partitioned join 和右表的 partition 没有直接关系, impala 会将右表打散成N份, 发送到左表所在的节点, 然后作join.
2. nested loop join: 针对非等值join, impala将使用 nested loop join, 这时我们不能设置 SHUFFLE/BROADCAST hint, 也不能使用 spill disk 功能. impala的非等值join的效率较低, Vertica的效率非常高, Hive直接不支持.

SELECT STRAIGHT_JOIN select_list FROM
join_left_hand_table
JOIN [{ /* +BROADCAST */ | /* +SHUFFLE */ }]
join_right_hand_table
remainder_of_query;

/* +SHUFFLE */ 即 partitioned join, 是将要关联的两个表按照
/* +BROADCAST */ 即
Exchange : the intermediate results are transmitted back to the coordinator node (labelled here as the EXCHANGE node)

==========================
最佳实践
==========================
Impala执行引擎还不是那么智能, 多表join 的SQL最好还是按照下面的推荐的写法:
1. 最大的表应该放在表清单的最左边.
2. 多个join的查询语句, 应该将选择性最强的join放在最前面.
3. 定期对表收集统计信息, 或者在大量DML操作后主动收集统计信息.
4. 在一个单一的查询里面, 参加join的表个数尽量不要超过4个, 不然效率比较低下.

Impala系列:Impala查询优化的更多相关文章

  1. Impala系列: Impala常用的功能函数

    --=======================查看内置的函数--=======================hive 不需要进入什么内置数据库, 即可使用 show functions 命令列出 ...

  2. impala系列:impala特有的操作符

    --=======================Impala 特有的操作符--=======================ILIKE 操作符, 忽略大小写的 like 操作符.REGEXP 操作符 ...

  3. 怎么理解impala(impala工作原理是什么)

    下面给大家介绍怎么理解impala,impala工作原理是什么. Impala是hadoop上交互式MPP SQL引擎, 也是目前性能最好的开源SQL-on-hadoop方案. 如下图所示, impa ...

  4. impala系列: 时间函数

    --=======================时间函数--======================= --当前时间戳now()current_timestamp() --当前时间戳相对于 li ...

  5. impala系列: 字符串函数

    --=======================常用字符串函数--=======================base64decode(string str) : base64 解码.base64 ...

  6. impala系列: 同步Hive元数据和收集统计信息

    ---====================-- Impala 获取hive 的 metadata ---====================Impala 通常和Hive共用同一个metadat ...

  7. impala系列: 基本命令和jdbc连接

    --======================= 使用impala-shell 登录 --======================= impala-shell --auth_creds_ok_i ...

  8. Impala学习–Impala后端代码分析

    Table of Contents 1 代码结构 2 StateStore 3 Scheduler 4 impalad启动流程 5 Coordinator 6 ExecNode 7 PlanFragm ...

  9. MySQL系列之三查询优化

    通常来说,查询的生命周期大致可以按照顺序来看从客户端到服务端,然后在服务器上进行解析,生产执行计划, 执行,并返回结果给客户端.其中的执行阶段可以认为是整个生命周期中最重要的阶段,其中包括了大量为了检 ...

随机推荐

  1. Hdoj 1003.Max Sum 题解

    Problem Description Given a sequence a[1],a[2],a[3]......a[n], your job is to calculate the max sum ...

  2. [USACO08DEC]在农场万圣节Trick or Treat on the Farm【Tarja缩点+dfs】

    题目描述 每年,在威斯康星州,奶牛们都会穿上衣服,收集农夫约翰在N(1<=N<=100,000)个牛棚隔间中留下的糖果,以此来庆祝美国秋天的万圣节. 由于牛棚不太大,FJ通过指定奶牛必须遵 ...

  3. [luogu1486][bzoj1503][NOI2004]郁闷的出纳员【平衡树treap】

    题目描述 OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常调整员工的工资 ...

  4. 英语考试 FZU - 2254 (最小生成树)

    先选一个单词出来完全自己背,然后从这个单词到其他各个单词所需要的精力看成距离,然后用最小生成树把这些单词连接起来,就是通过我现在选的这个单词到其他各个单词的最小精力,然后再加上把这个单词背起来的精力, ...

  5. 合法括号序列(dp+组合数学)

    键盘上有左括号(,右括号),和退格键-,共三个键. 牛牛希望按键n次,使得输入的字符串恰好一个合法的括号序列. 每按一次左括号(,字符串末尾追加一个左括号( 每按一次右括号),字符串末尾追加一个右括号 ...

  6. python 验证码识别

    一.python识别简单验证码: 代码: ''' func:实现简单验证码获取 ''' import pytesseract from PIL import Image #首先通过Image打开一个图 ...

  7. CAS与ABA问题产生和解决

    乐观锁和悲观锁 Synchronized属于悲观锁,悲观地认为程序中的并发情况严重,所以严防死守.CAS属于乐观锁,乐观地认为程序中的并发情况不那么严重,所以让线程不断去尝试更新. 性能对比: Syn ...

  8. electron入门笔记(三)- 引入bootstrap

    源码:https://github.com/sueRimn/electron-bootstrap 当引入jQuery和bootstrap文件时,会报错,原因是:electron 的 Renderer ...

  9. CF1107

    我哭了......什么鬼题我怎么都不会...果然教育场是教我做人的... 打的虚拟赛,286名...太菜了.EF都是可做题我都没写出来...G题大水题我居然没看... B:设g(i) = i的各位数字 ...

  10. MAC安装JDK及环境变量配置

    1.访问Oracle官网 http://www.oracle.com,浏览到首页的底部菜单 ,然后按下图提示操作: 2.点击“JDK DOWNLOAD”按钮: 3.选择“Accept Lisence ...