1. Doris查询报错。
查看be节点日志。log/be.INFO 如下:
mem pool.cpp:131] try to allocate a new buffer failed:Memory limit exceeded: ExecNode:Exprs :AGGREGATION NODE(d=15):6c729c44502441ef-b74efd2a2551cb4b:IruConsume failedbutes=4h96nrocess whole consumtion=22183146688memmit=26834019942
0784 15:52:24521668 64800 status.h:20] warning: Status msg truncated,0K: Could not allocate aggrerate expression imput valueExecMode:Exprs:AGGREGATIN NODE (id-15):6c720c4d57441ef-b74efd2a2551cb4b could not allocate 16.88 B without exceeding limit,Error occurred on backend XXX.XXX.XXX.XXX by fragment 6c?20c4d507441ef-b74efd2a2551cb55
官网解释:当查询或导入报错Memory limit exceeded
时,可能的原因:进程内存超限、系统剩余可用内存不足、超过单次查询执行的内存上限。 链接:内存超限错误分析 - Apache Doris
2. 原因
doirs在查询时,为了防止用户的消耗内存过大。进行了内存控制,一个查询任务,在单个 BE 节点上默认使用不超过 2GB 内存。
遇到内存超限时,用户应该尽量通过优化自己的 sql 语句来解决。
如果确切发现2GB内存不能满足,可以手动设置内存参数。
显示查询内存限制:
//单位是 byte
SHOW VARIABLES LIKE "%mem_limit%";
2. 解决
修改Doris mem_limit参数
//设置为4G 这个只对当前会话有效
SET exec_mem_limit = 4294967296;
//全局永久设置
SET GLOBAL exec_mem_limit = 4294967296;
注:设置全局变量后,断开 session 重新登录,参数将永久生效。这里笔者没有重新登录,SHOW VARIABLES LIKE "%mem_limit%"; 时值已经改变,但是查询仍报错!!!!
若还不生效,重启be节点!