【问题标题】:Apache Storm 2.1.0 memory related configurationsApache Storm 2.1.0 内存相关配置
【发布时间】:2020-10-10 03:39:02
【问题描述】:
我们正在从 1.1.x 迁移到 2.1.0。
在我们当前的设置中,storm.yaml 中有以下内存配置
nimbus.childopts: -Xmx2048m
supervisor.childopts: -Xmx2048m
worker.childopts: -Xmx16384m
我在https://github.com/apache/storm/blob/master/conf/defaults.yaml 中看到了许多其他与内存相关的配置,并且对它们有以下疑问。
-
worker.childopts 和 topology.worker.childopts 有什么区别?如果我们在storm.yaml中设置worker.childopts,我们还需要覆盖topology.worker.childopts吗?
- 如果我们在storm.yaml中设置worker.childopts,我们还需要覆盖worker.heap.memory.mb吗?这两个配置之间有关系吗?
- 应该topology.component.resources.onheap.memory.mb worker.childopts?我们应该如何确定 topology.component.resources.onheap.memory.mb 的值?
如果有人能解释这些观点,不胜感激。
【问题讨论】:
标签:
apache-storm
topology
apache-storm-topology
storm-topology
apache-storm-configs
【解决方案1】:
我最近自己修改了其中一些配置,所以我在这里分享我的见解:
-
worker.childopts vs topology.worker.childopts - 第一个参数为所有工作人员设置 childopts。第二个参数可用于覆盖单个拓扑的参数,例如通过使用conf.put(Config.TOPOLOGY_WORKER_CHILDOPTS, "someJvmArgsHere");
-
根据storm git,worker.childopts 的默认值为"-Xmx%HEAP-MEM%m -XX:+PrintGCDetails -Xloggc:artifacts/gc.log -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=1M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=artifacts/heapdump"。注意第一个参数,它包含一个替换模式%HEAP-MEM%。此模式将替换为您为worker.heap.memory.mb 配置的任何内容。您可以从 Java 的拓扑配置中覆盖后一个参数,因此我猜他们以这种方式构建它以便能够快速修改各个拓扑的 Java 堆。我注意到的一件事是,在覆盖时,storm 似乎只有在至少一个 spout 或 bolt 配置了 .setMemoryLoad(int heapSize) 时才使用覆盖值。
-
这在很大程度上取决于各个拓扑的需求,但总的来说,让topology.component.resources.onheap.memory.mb 小于您在worker.childopts 中为 -Xmx 配置的任何值很可能是一个非常好的主意。如何为topology.component.resources.onheap.memory.mb 找到合适的值取决于测试和了解拓扑组件的内存消耗。例如,我有一个从 redis 接收元组并发出它们的拓扑。如果 bolts 很忙,元组可能会堆积在 spout 中,因此我在内存方面配置了一些空间。但是,我通常不会修改topology.component.resources.onheap.memory.mb,而是使用拓扑组件的setMemoryLoad(int heapSize) 方法,因为这允许为拓扑的各个组件设置不同的值。此主题和相关主题的 Storm 文档是 here。