Apache Drill |如何在磁盘上配置Spill

时间:2017-11-14 04:22:57

标签: memory-management filesystems hdfs apache-drill

我通过使用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:///"
  }
 }
}

仍然会出现相同的内存异常。

任何人都可以帮助我。

2 个答案:

答案 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,通常太小。

启用溢出并不是解决所有内存问题的灵丹妙药。需要检查具体细节(检查日志中的堆栈跟踪)以找出哪个运算符失败。一些可能性:

  1. 哈希加入尚不支持溢出。如果需要加入大型数据集,最好禁用(alter session set `planner.enable_hashjoin` = false;),这样就可以使用merge-join。
  2. 外部排序有一个新版本(&#34;托管&#34;),可以更好地处理内存。要启用使用托管版本,请设置&#34; drill.exec.sort.external.disable_managed&#34;的配置。为假。 (这将成为Drill 1.12中的默认设置。)
  3. Hash Aggregate溢出支持是一项新功能(Drill 1.12可能会更好)。这里的选项:禁用(alter session set `planner.enable_hashagg` = false;),或尝试增加&#34; exec.hashagg.min_batches_per_partition&#34;更高的值(4或5)。
  4. TopN运算符(在查询同时具有ORDER BY和LIMIT子句时使用)存在一些内存问题(在1.12中已修复)。这可以通过设置&#34; purge.threshold:10&#34;的配置覆盖来修复。在drill.exec.sort。