我在拥有16GB内存的ubuntu机器上本地运行apache drill 1.0(然后是1.4)。当我使用非常大的制表符分隔文件(52百万行,7GB),并执行
Select distinct columns[0] from `table.tsv`
,在第二次运行相同的查询时,性能似乎没有提高(两者都耗时53秒)。通常第二次运行相同的查询时,与第一次查询相比,所需时间不到一半。好像Drill没有使用所有已分配的内存。
我的conf / drill-env.sh文件如下所示:
DRILL_MAX_DIRECT_MEMORY="14G"
DRILL_HEAP="14G"
export DRILL_JAVA_OPTS="-Xms$DRILL_HEAP -Xmx$DRILL_HEAP -XX:MaxDirectMemorySize=$DRILL_MAX_DIRECT_MEMORY -XX:MaxPermSize=14G -XX:ReservedCodeCacheSize=1G -Ddrill.exec.enable-epoll=true"
我也在演练
中做了这个alter system set `planner.memory.max_query_memory_per_node`=12884901888
但是,当我使用smem检查内存使用情况时,它只使用大约5GB的RAM。
如果我将表格大小减少到只有1百万行,我可以看到第一个查询在3.6秒内完成,第二次查询运行相同的查询,只花了1.8秒
我错过了什么?
答案 0 :(得分:0)
您只有16 GB的RAM,Drill不可能使用14 GB的堆和14 GB的直接内存。这些类型的内存不重叠。
我建议您为操作系统保留2 GB,因此剩下14 GB,为直接内存分配12 GB,为堆分配2 GB。
您将找到名为 planner.width.max_per_node 的选项,其值为核心数的70%。将其增加到您认为合适的数量。
您可能需要阅读the answers for this question。
答案 1 :(得分:0)
我可以获得查询以使用所有可用内存(如定义的那样)
由set planner.memory.max_query_memory_per_node = n
)来
set planner.memory.min_memory_per_buffered_op = n
(与...相同)
planner.memory.max_query_memory_per_node。
我无法在set planner.memory.min_memory_per_buffered_op上找到任何文档,我不确定这是否是预期的行为。