配置内存
你可以在任意 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
。
注意:如果 XX:MaxDirectMemorySize 不设置,该限制取决于系统可用内存。
在你编辑 <drill_installation_directory>/conf/drill-env.sh
,之后,在节点上重启 Drillbit 服务。
关于 Drillbit 的启动脚本
在 drill-env.sh
文件中包含以下选项:
DRILL_MAX_DIRECT_MEMORY="8G"
DRILL_MAX_HEAP="4G"
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,示例内容如下所示:
export DRILL_JAVA_OPTS="-Xms1G -Xmx$DRILL_MAX_HEAP -XX:MaxDirectMemorySize=$DRILL_MAX_DIRECT_MEMORY -XX:MaxPermSize=512M -XX:ReservedCodeCacheSize=1G -Dbounds=false"