我正在Apache Drill
系统上使用1.14
版本windows
,并使用以下命令运行Drill:
sqlline.bat -u "jdbc:drill:zk=local"
我正在尝试在两个execute
和join 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;
答案 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;