storm 如何强制执行组件内存约束

How storm enforce component memory constraint

Storm 可以选择使用 setMemoryLoad 函数配置每个组件 (bolt/spout) 的内存大小。由于工作进程都在同一个 JVM 中,因此工作进程如何根据 executor/tasks 强制执行此约束?

我认为您误解了 setMemoryLoad 的用途。

SetMemoryLoad 和类似的方法(例如 setCPULoad)不能确定实际分配给组件的内存或 CPU 量。它们是资源感知调度程序 https://storm.apache.org/releases/2.0.0-SNAPSHOT/Resource_Aware_Scheduler_overview.html.

的提示

您配置每个主管上有多少 memory/cpu 可用,资源感知调度程序使用该信息以及您在组件上设置的 memory/cpu 负载来尝试分发您的组件以一种有意义的方式与你的主管交流。如果例如,您可能想要这个你想在你的集群中均匀分布你的重组件,或者如果你的主管是异构的(也就是说,你有一些弱机器和一些强大的机器并且你不希望 Storm 运行 非常繁忙的组件在弱机)。

我相信 Storm 确实能够强制执行您指定的 CPU/memory 限制,但您必须为此 http://storm.apache.org/releases/2.0.0-SNAPSHOT/cgroups_in_storm.html 启用 cgroups。我不太熟悉那部分代码,但它允许您为每个工作 JVM 设置一个固定限制,或者尝试根据资源感知调度程序的分配动态设置限制。

正如我所说,我不熟悉 cgroups 支持,所以这可能是错误的,但我想 Storm 可以在引导 JVM 时为工作 JVM 设置 cgroup 限制。因此,例如,如果 RAS 将一个 boltA 实例和一个 boltB 实例分配给您的工作人员,则整个工作人员的组合限制仅为 512+1024 兆。