【问题标题】:How storm enforce component memory constraintStorm 如何强制执行组件内存约束
【发布时间】:2019-04-04 05:27:24
【问题描述】:

Storm 可以使用 setMemoryLoad 函数来配置每个组件(bolt/spout)的内存大小。工作进程如何对每个执行程序/任务强制执行此约束,因为它们都在同一个 JVM 中?

【问题讨论】:

  • 所有的executor和task一般不在同一个JVM中?也许我误解了你,但任务通常分布在许多 JVM 中。
  • 假设我有一个只有一个节点、一个工人(插槽)和 2 个螺栓的拓扑。 builder.setBolt("A", new BoltA(), 1).setMemoryLoad(512.0); builder.setBolt("B", new BoltB(), 1).setMemoryLoad(1024.0);两个执行器都将在同一个worker(JVM)中的2个不同线程中运行,但内存分配给JVM进程而不是线程。所以我不明白每个线程的内存分配是如何完成的@StigRohdeDøssing

标签: apache-storm


【解决方案1】:

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

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

您配置每个主管上可用的内存/cpu 数量,资源感知调度程序使用该信息以及您在组件上设置的内存/cpu 负载,尝试以某种方式在您的主管之间分配组件那讲得通。如果你可能想要这个,例如你想在你的集群中平均分配你的重组件,或者如果你的主管是异构的(也就是说,你有一些弱机器和一些强机器,你不希望 Storm 在弱机器上运行非常繁忙的组件)。

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

正如我所说,我不熟悉 cgroups 支持,所以这可能是错误的,但我想 Storm 可以在启动 JVM 时为工作 JVM 设置 cgroup 限制。因此,例如,如果 RAS 将一个 boltA 实例和一个 boltB 实例分配给您的 worker,那么整个 worker 将只有 512+1024 megs 的组合限制。

【讨论】:

    猜你喜欢
    • 2012-12-05
    • 2011-09-07
    • 2015-07-13
    • 1970-01-01
    • 1970-01-01
    • 2016-03-24
    • 1970-01-01
    • 1970-01-01
    • 2018-03-07
    相关资源
    最近更新 更多