配置内存

你可以在任意 Drill 集群直接配置其所分配的内存给 Drillbit。Drillbit 默认的内存是 8G,但是 Drill 在 16G 表现更佳,另外也取决于工作量。Drill 的查询操作不能超过其分配的总内存。

Drill 使用 Java 直接操作内存并在内存中执行任务。它不会存储磁盘,而是直接在内存中。Drill 除非有必要才会写磁盘,不像 MapReduce 的 Job,时时刻刻都要回写磁盘。

在 Drillbit 中,JVM 的堆内存不限制直接存储的内存。在堆内内存通常设置为 4-8G(默认是 4),这样已经足够了,因为 Drill 避免了数据堆积在堆内存中。

决定 planner.memory.max_query_memory_per_node 系统选项中的内存限制每个节点的查询,特别是那些涉及外部类,例如窗口函数。当你有足够大的内存时,你查询时仍会遇到内存问题,这是就需要增加该选项。

修改 Drillbit 内存

在你的集群上,你可以修改每个 Drillbit 节点的内存。为了修改内存,你可以在启动脚本中编辑 XX:MaxDirectMemorySize 参数,drill-env.sh 位于 <drill_installation_directory>/conf

  1. 注意:如果 XX:MaxDirectMemorySize 不设置,该限制取决于系统可用内存。

在你编辑 <drill_installation_directory>/conf/drill-env.sh,之后,在节点上重启 Drillbit 服务。

关于 Drillbit 的启动脚本

drill-env.sh 文件中包含以下选项:

  1. DRILL_MAX_DIRECT_MEMORY="8G"
  2. DRILL_MAX_HEAP="4G"
  3. export DRILL_JAVA_OPTS="-Xms1G -Xmx$DRILL_MAX_HEAP -XX:MaxDirectMemorySize=$DRILL_MAX_DIRECT_MEMORY -XX:MaxPermSize=512M -XX:ReservedCodeCacheSize=1G -ea"
  • DRILL_MAX_DIRECT_MEMORY 表示每个节点 Java 的内存限制。
  • DRILL_MAX_HEAP 表示每个节点的 JVM 最大堆限制。
  • Xmx 指向 JVM 最大内存分配池。
  • Xms 指向初始化内存分配池。

如果有性能问题,替换 -ea 为 -Dbounds=false,示例内容如下所示:

  1. export DRILL_JAVA_OPTS="-Xms1G -Xmx$DRILL_MAX_HEAP -XX:MaxDirectMemorySize=$DRILL_MAX_DIRECT_MEMORY -XX:MaxPermSize=512M -XX:ReservedCodeCacheSize=1G -Dbounds=false"