本文已参与「新人创作礼」活动,一起开启掘金创作之路。
错误信息
ExecQueryFInstances rpc query_id=bf408e145c3fc6fb:b3e100c100000000
failed: Failed to get minimum memory reservation of 105.88 MB on daemon dx-hadoop115.dx:22000 for query bf408e145c3fc6fb:b3e100c100000000 because it would exceed an applicable memory limit.
Memory is likely oversubscribed. Reducing query concurrency or configuring admission control may help avoid this error.
Memory usage:
Process: Limit=16.00 GB Total=9.95 GB Peak=14.61 GB
Buffer Pool: Free Buffers: Total=172.00 MB
Buffer Pool: Clean Pages: Total=1.28 GB
Buffer Pool: Unused Reservation: Total=-6.11 GB
Free Disk IO Buffers: Total=623.88 MB Peak=623.88 MB RequestPool=root.hive: Total=12.82 GB Peak=12.88 GB
Query(224a58d7a2aefc66:d931db1200000000): Reservation=12.80 GB ReservationLimit=12.80 GB OtherMemory=23.31 MB Total=12.82 GB Peak=12.82 GB
Query(bf408e145c3fc6fb:b3e100c100000000): Reservation=0 ReservationLimit=12.80 GB OtherMemory=0 Total=0 Peak=0
RequestPool=root.wangshuangjie: Total=0 Peak=12.16 MB
RequestPool=root.baixike: Total=0 Peak=112.13 MB
RequestPool=root.macheng: Total=0 Peak=116.15 MB
RequestPool=root.liuyiyu: Total=0 Peak=7.52 MB
RequestPool=root.risk: Total=0 Peak=7.52 MB
Untracked Memory: Total=1.18 GB
可能原因:
- impala内存溢出异常
- 有资源限制
问题原因:
通过分析日志 bf408e145c3fc6fb:b3e100c100000000
任务失败的原因是内存可能超额订阅。 减少查询并发或配置准入控制可能有助于避免此错误。
继续往下看: 下面是这个问题的主要原因:
RequestPool=root.hive: Total=12.82 GB Peak=12.88 GB
Query(224a58d7a2aefc66:d931db1200000000): Reservation=12.80 GB ReservationLimit=12.80 GB OtherMemory=23.31 MB Total=12.82 GB Peak=12.82 GB
Query(bf408e145c3fc6fb:b3e100c100000000): Reservation=0 ReservationLimit=12.80 GB OtherMemory=0 Total=0 Peak=0
root.hive
资源池只有12GB,被224a58d7a2aefc66:d931db1200000000
这个任务基本全部耗尽,导致bf408e145c3fc6fb:b3e100c100000000
这个任务失败。
解决方案:
- kill掉占资源的任务
- 解决方法就是把内存限制取消,或者加大
set mem_limit=-1
#取消 或者 1gb 100mb 1000b等值 如果以上还不行,就要去配置文件修改 Impala Daemon 内存限制mem_limit=-1b
单池内存限制
default_pool_mem_limit=-1b
说明 :
default_pool_mem_limit
:
配置使用单个池时用于 Admission Control 的运行查询的最大内存。-1 或 0 表示无限制。已启用“用于 Admission Control 的动态资源池”时忽略。
mem_limit
:
由守护程序本身强制执行的 Impala Daemon 的内存限制(以字节为单位)。如果达到该限制,Impalad Daemon 上运行的查询可能会被停止。将其留空可以让 Impala 选择自己的限制。使用 -1 B 值将指定无任何限制。
如图: