我一直在玩风暴拓扑设置,以便在不遇到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
,那么 - 当然 - 所有执行程序都会正常工作并且吞吐量会增加。
LOCAL_OR_SHUFFLE
中没有使用其他执行者?是
因为正在做这项工作的4位遗嘱执行人并非如此
最大限度地足够?LOCAL_OR_SHUFFLE
模式下将工作推送给远程工作人员?非常感谢任何见解或建议。
除了下面选择的答案之外,我认为在平行线上选择SHUFFLE,然后在跟随螺栓上选择LOCAL_OR_SHUFFLE也将确保所有工人保持忙碌,同时享受保持跟随当地工作的潜在速度优势。
答案 0 :(得分:0)
关于此的一些一般性评论:如果您只有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 ?这可以保证所有执行者获得完全相同的工作份额。