微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

java.lang.OutOfMemoryError:Druid 摄取任务期间的直接缓冲内存

如何解决java.lang.OutOfMemoryError:Druid 摄取任务期间的直接缓冲内存

我正在使用 Kafka 摄取任务将数据摄取到 Druid。 测试数据为 1 条消息/秒。每条消息都有 100 个数字列和 100 个字符串列。数值是随机的。字符串值取自 10k 个随机 20 个字符字符串的池。我有每个数字列的总和、最小和最大聚合。

配置如下:

  • 细分粒度:15 分钟。
  • 中间持续时间:2 分钟。
  • druid.processing.buffer.sizeBytes=26214400
  • druid.processing.numMergeBuffers=2
  • druid.processing.numThreads=1

德鲁伊文档说理智的最大直接内存大小是

(druid.processing.numThreads + druid.processing.numMergeBuffers + 1) * druid.processing.buffer.sizeBytes

其中“+1 因子是一个模糊估计,用于说明段解压缩缓冲区和字典合并缓冲区。”

根据公式,我需要 100 MB 的直接内存,但即使我将最大直接内存设置为 250 MB,我也会得到 java.lang.OutOfMemoryError: Direct buffer memory。这个错误不一致:有时我有这个错误,有时我没有。

我的目标是在开始任务之前计算最大直接内存,并且在任务执行期间不会出错。我的猜测是我需要精确计算这个“+1 因子”。我该怎么做?

解决方法

根据我的经验,该公式非常好,除了要注意 MB 不是 1000 KB,而是 1024。但我很惊讶它仍然给你 250MB 的错误。你如何设置直接内存大小?你是否在使用带有 Peons 的 MiddleManager?因为实际工作是由人员来做的,你必须在人员上设置最大直接内存,而不是中层管理人员。您可以使用 Middle Manager runtime.properties 中的以下参数来执行此操作。这是我的:

druid.indexer.runner.javaOptsArray=["-server","-Xms200m","-Xmx200m","-XX:MaxDirectMemorySize=220m","-Duser.timezone=UTC","-Dfile.encoding =UTF-8","-Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager","-XX:+ExitOnOutOfMemoryError","-XX:+HeapDumpOnOutOfMemoryError","-XX:HeapDumpPath =/var/log/druid/task/"]

您也必须以这种方式设置其他属性:druid.indexer.fork.property.druid.processing.buffer.sizeBytes druid.indexer.fork.property.druid.processing.numMergeBuffers druid.indexer.fork.property.druid.processing.numThreads

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。