Apache Drill:如何解决-资源错误:执行查询时一个或多个节点内存不足?

时间:2018-10-24 16:27:55

标签: java out-of-memory apache-drill

我正在Apache Drill系统上使用1.14版本windows,并使用以下命令运行Drill:

sqlline.bat -u "jdbc:drill:zk=local"

我正在尝试在两个executejoin query compressed文件上archived一个CSV

查询:

SELECT  *  FROM dfs.`C:\Users\admin\Desktop\DRILL_FILES\csvFileParquet\TBL_MOREDATA-20180924181406.tar.gz` AS Table0 INNER JOIN dfs.`C:\Users\admin\Desktop\DRILL_FILES\csvFileParquet\TBL_MOREDATA1-20180924181406.tar.gz` AS Table1  ON  Table0.columns[0]=Table1.columns[0]

但是内存不足,发生了错误:

org.apache.drill.common.exceptions.UserRemoteException: RESOURCE ERROR: One or more nodes ran out of memory while executing the query. Unable to allocate buffer of size 131072 (rounded from 86104) due to memory limit (630194176). Current allocation: 630108434 Fragment 0:0 [Error Id: 585c0644-5fd5-446e-b9b3-d48e0771eb2a on DESKTOP-SM3E3KM:31010]

要解决此问题,我尝试更新config\drill-env.sh文件,但问题仍然存在,并且更新脚本文件似乎无法反映所做的更改,因为我试图将DIRECT MEMORY增加到系统内存之外(RAM),每次练习和平启动。甚至没有抱怨您已经超出了内存,因此,这些更改似乎没有反映出来。

export DRILLBIT_MAX_PROC_MEM=12G
export DRILL_HEAP=2G
export DRILL_MAX_DIRECT_MEMORY=10G

而我系统的主内存只有8 GB。

请帮助我解决内存不足错误。为了执行故障排除说明,我什至运行了以下查询,但问题仍然相同。

alter session set `planner.enable_hashagg` = false;  
alter session set `planner.enable_hashjoin` = false;
alter session set planner.width.max_per_node=3; 
alter system set planner.width.max_per_query = 100;

1 个答案:

答案 0 :(得分:1)

基于doc钻子,仅支持读取压缩文件,不存档。您可以创建一个Jira票证来实施它。 如果已存档压缩的CSV文件读取,则Drill返回第一行的不可读数据。因此,您可以使用offset 1

钻取利用直接内存来存储批次。因此,JOIN操作需要更多直接内存。 减少并行性可以减少内存消耗:
planner.width.max_per_node(以及可选的planner.width.max_per_query设置为1)。
禁用HashJoin运算符用法:planner.enable_hashjoin
Drill documentation.中查看更多
还可以考虑启用planner.memory.enable_memory_estimation选项。

要验证是否应用了drill-env.sh中的配置,请运行以下查询:

select * from sys.memory;