我通过使用MySQL和Mongo数据源查询带有MySQL和Mongo数据源的8GB RAM上的2000万个数据,在Apache钻取上进行R& D。
然后,尝试通过在drill-override.conf中进行配置来配置磁盘上的Spill。
drill.exec: {
cluster-id: "APDCluster1",
zk.connect: "192.168.1.16:2181",
spill: {
directories: ["/data/enliven/installations/ApacheD/drill/spill"],
fs: "file:///"
}
sort: {
external: {
batch.size: 4000,
spill: {
batch.size: 4000,
group.size: 100,
threshold: 200,
directories: ["/data/enliven/installations/ApacheD/drill/spill"],
fs: "file:///"
}
}
},
hashagg: {
spill: {
directories: ["/data/enliven/installations/ApacheD/drill/spill"],
fs: "file:///"
}
}
}
仍然会出现相同的内存异常。
任何人都可以帮助我。
答案 0 :(得分:1)
根据http://www.openkb.info/2015/05/drill-workshop-spill.html,为了测试钻探溢油的有效性,您应该将提供的内存量减少到例如20 MB:
alter session set `planner.memory.max_query_memory_per_node`=20971520;
然后测试查询并检查文件系统是否有溢出效果。
此外,如果您有8 GB可用(来自https://drill.apache.org/docs/configuring-drill-memory/),最好先检查一下您是否提供了足够的堆:
drill-env.sh文件包含以下选项:
#export DRILL_HEAP=${DRILL_HEAP:-"4G”}
#export DRILL_MAX_DIRECT_MEMORY=${DRILL_MAX_DIRECT_MEMORY:-"8G"}
要自定义内存限制,请取消注释所需的行并更改设置:
export DRILL_HEAP=${DRILL_HEAP:-"<limit>”}
export DRILL_MAX_DIRECT_MEMORY=${DRILL_MAX_DIRECT_MEMORY:-“<limit>"}
答案 1 :(得分:1)
您拥有的drill-override.conf设置是正确的(尽管无需指定操作员特定的设置.surke.exec.spill。*对所有溢出操作符都是通用的。特定于操作符的(如drill.exec。 hashagg.spill.fs)将来会被弃用。)
planner.memory.max_query_memory_per_node
是一个重要的设置。理想情况下,应将其设置为接近直接内存大小的大小除以使用的并发查询流的数量。默认设置为2GB,通常太小。
启用溢出并不是解决所有内存问题的灵丹妙药。需要检查具体细节(检查日志中的堆栈跟踪)以找出哪个运算符失败。一些可能性:
alter session set `planner.enable_hashjoin` = false;
),这样就可以使用merge-join。alter session set `planner.enable_hashagg` = false;
),或尝试增加&#34; exec.hashagg.min_batches_per_partition&#34;更高的值(4或5)。