Apache Storm:LOCAL_OR_SHUFFLE没有将工作推送给其他执行者

时间:2016-08-26 11:52:45

标签: apache-storm

我一直在玩风暴拓扑设置,以便在不遇到OutOfMemory错误的情况下实现最大吞吐量。

我的设置:

3节点风暴(v1.0.1)群集。显然,一个节点也是主节点,部署到AWS m3.2xlarge实例上。有12名工人(每个节点4名):

topology.workers: 12

并且每个worker有4 GB的堆空间:

worker.heap.memory.mb: 4096

特别是我的一个螺栓,我们称之为:HashingBolt具有 12 的并行性提示。

这会创建12个执行程序,每个执行程序只有一个任务(因为我使用Flux来配置/部署)。 流 HashingBolt的流类型为LOCAL_OR_SHUFFLE

我期待的是:

当点击Storm UI中的HashingBolt时,我希望在执行者(所有时间)部分下看到12行 - 每个执行者一行 - 并且每行都会被激活东西。

我希望风暴首先最大化4个本地执行器(在主节点上,因为LOCAL_OR_SHUFFLE更喜欢本地执行器,如果可用的话),然后恢复为shuffle并开始最大化其他两个执行器节点

我实际看到了什么:

只有4位遗嘱执行人做过任何事。所有其他人都处于空闲状态,从不会发出任何声音。我假设这是因为那4个执行者是本地的,这是首选。

现在,如果我将流类型更改为SHUFFLE,那么 - 当然 - 所有执行程序都会正常工作并且吞吐量会增加。

我的问题:

  1. 我的猜测是否正确? 4个执行者是否正在做本地的执行者?或者那是一只红鲱鱼?
  2. 为什么LOCAL_OR_SHUFFLE中没有使用其他执行者?是 因为正在做这项工作的4位遗嘱执行人并非如此 最大限度地足够
  3. 如果4个本地执行程序不足,那么我该怎么做呢?这与流缓冲区大小有关吗?我应该减少/增加等吗?
  4. 如果我将工作人员数量更改为3(每个节点一个),那么我是否会开始在LOCAL_OR_SHUFFLE模式下将工作推送给远程工作人员?
  5. 非常感谢任何见解或建议。

    除了下面的答案

    除了下面选择的答案之外,我认为在平行线上选择SHUFFLE,然后在跟随螺栓上选择LOCAL_OR_SHUFFLE也将确保所有工人保持忙碌,同时享受保持跟随当地工作的潜在速度优势。

1 个答案:

答案 0 :(得分:0)

  1. 我很确定这是4个本地的(使用Storm UI,你可以点击一个螺栓来查看每个执行器的部署位置,哪个获取数据,哪个没有 - 所以你可以实际验证这看主机/ port,标识每个工作进程)
  2. 我会这么认为。使用Storm UI,您可以看到"容量"列显示每个执行者的负载;所以你可以验证。
  3. 你为什么要把它们最大化?你会得到什么?
  4. 如果你只有3名工人,我实际上不确定是否会考虑所有本地执行人。但即使问题再次出现,你会获得什么?
  5. 关于此的一些一般性评论:如果您只有3个节点,那么从性能的角度来看,使用比节点更多的工作者并不会带来太大的收获。唯一的性能优势是每个内部"调度程序线程的负载较少" (见http://www.michael-noll.com/blog/2013/06/21/understanding-storm-internal-message-buffers/)。作为工作者,JVM本质上是多线程的,您可以为单个工作人员分配更多执行程序 - 只要您的计算机具有足够的核心,您就可以获得所需的速度。

    每个拓扑结构使用比可用节点更多的工作者的主要目的实际上是为了获得更好的容错能力。如果一个工作者JVM失败,那么执行者就会失败。单个管理员可以拥有多个工作者JVM的原因是拓扑隔离。单个工作JVM将仅从单个拓扑执行spouts / bolt。因此,如果要在单个主机上部署多个拓扑,则每个拓扑每个主机至少需要一个工作线。

    关于本地或随机播放:如果您使用本地随机播放,为什么您担心并非所有下游执行者都分配了工作?如果本地的可以处理负载,那么拓扑运行就好......如果无法处理负载,数据将自动分配给其他人。所以我不明白你担心并非所有执行者都能获得输入数据。

    此外,如果您想让所有执行者都忙,为什么不使用 shuffle 而不是 local-or-shuffle ?这可以保证所有执行者获得完全相同的工作份额。