==========================
理解 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执行会消耗多大内存, 预测主要是依据表的统计信息,