Apache storm ApacheStorm:LOCAL_或_SHUFFLE不将工作推给其他执行者

Apache storm ApacheStorm:LOCAL_或_SHUFFLE不将工作推给其他执行者,apache-storm,Apache Storm,我一直在使用storm拓扑设置,以便在不出现OutOfMemory错误的情况下实现最大吞吐量 我的设置: 3节点风暴(v1.0.1)集群。显然,一个节点也是主节点,部署在AWS m3.2x大型实例上。共有12名工作人员(每个节点4名): 每个辅助进程有4 GB堆空间: worker.heap.memory.mb: 4096 特别是我的一个螺栓,我们称之为:HashingBolt有一个并行性提示12 这将创建12个执行器,每个执行器一个任务(因为我使用Flux来配置/部署)。 HashingBo

我一直在使用storm拓扑设置,以便在不出现OutOfMemory错误的情况下实现最大吞吐量

我的设置: 3节点风暴(v1.0.1)集群。显然,一个节点也是主节点,部署在AWS m3.2x大型实例上。共有12名工作人员(每个节点4名):

每个辅助进程有4 GB堆空间:

worker.heap.memory.mb: 4096
特别是我的一个螺栓,我们称之为:
HashingBolt
有一个并行性提示12

这将创建12个执行器,每个执行器一个任务(因为我使用Flux来配置/部署)。
HashingBolt
的流类型为
LOCAL\u或\u SHUFFLE

我期待的是: 在Storm UI中单击
HashingBolt
时,我希望在Executors(所有时间)部分下看到12行-每个executor一行-每行都有内容

我希望storm首先最大化4个本地执行器(在主节点上,因为
local\u或\u SHUFFLE
更喜欢本地执行器,如果可用),然后恢复到SHUFFLE并开始最大化其他两个节点上的执行器

我看到的是: 只有4名遗嘱执行人做过任何事。所有其他的都是空闲的,从来没有确认/发出任何东西。我假设这是因为这4名遗嘱执行人是当地人,他们是优先考虑的

现在,如果我将流类型更改为SHUFFLE,那么——当然——所有执行器都会工作,吞吐量也会增加

我的问题是:
  • 我的猜测正确吗?这4位遗嘱执行人是当地人吗?还是说这是在转移注意力
  • 为什么在
    LOCAL\u或\u SHUFFLE
    中没有使用其他执行器?是 这是因为做这项工作的4名执行人没有 马克斯已经够了吗
  • 如果4名当地遗嘱执行人没有得到足够的保护,我该怎么做?这与流缓冲区大小有关吗?我应该减少/增加等吗
  • 如果我将worker的数量更改为3(每个节点一个),那么我会开始看到在
    LOCAL\u或\u SHUFFLE
    模式下将工作推送到远程worker吗
  • 任何见解或建议都将不胜感激

    补充以下答案 除了下面选择的答案外,我相信选择平行排列的螺栓上的SHUFFLE,然后在以下螺栓上选择LOCAL_或_SHUFFLE,也将确保所有工人都保持忙碌,同时享受保持以下工作在本地的潜在速度优势

  • 我非常确定这是4个本地执行器(使用Storm UI,您可以单击一个螺栓,查看每个执行器部署在何处,哪个执行器获取数据,哪个不获取数据——因此您可以查看标识每个工作进程的主机/端口来实际验证这一点)
  • 我想是的。使用Storm UI,您可以看到“容量”列,显示每个执行器的负载;所以你可以验证
  • 你为什么要把它们最大化?你会得到什么
  • 如果你只有3名员工,我实际上不确定是否会考虑所有当地遗嘱执行人。但即使如此,问题是,你会得到什么
  • 关于这一点的一些一般性评论:如果您只有3个节点,那么从性能角度来看,使用比节点更多的worker并不会带来太多好处。唯一的性能优势是每个内部“调度程序线程”的负载更少(请参阅)。由于worker JVM本质上是多线程的,所以您可以将更多的执行器分配给单个worker——只要您的机器有足够的内核,您就可以获得所需的速度

    与可用节点相比,每个拓扑使用更多工作节点的主要目的实际上是获得更好的容错性。如果一个工作JVM失败,那么执行器就会减少。一个主管可以有多个工作JVM的原因是拓扑隔离。单个辅助JVM将只执行单个拓扑中的喷口/螺栓。因此,如果要在单个主机上部署多个拓扑,则每个拓扑中每个主机至少需要一个工作线程

    关于local或shuffle:如果您使用local of shuffle,为什么您会担心并非所有下游执行者都得到分配的工作?如果本地的可以处理负载,你的拓扑运行得很好。。。如果用户无法处理负载,数据将自动分发给其他用户。所以我不理解你的担心,不是所有的执行者都能得到输入数据

    此外,如果您想让所有执行者都忙起来,为什么不使用随机播放,而不是本地或随机播放?这保证了所有执行者都能得到完全相同的工作份额

  • 我非常确定这是4个本地执行器(使用Storm UI,您可以单击一个螺栓,查看每个执行器部署在何处,哪个执行器获取数据,哪个不获取数据——因此您可以查看标识每个工作进程的主机/端口来实际验证这一点)
  • 我想是的。使用Storm UI,您可以看到“容量”列,显示每个执行器的负载;所以你可以验证
  • 你为什么要把它们最大化?你会得到什么
  • 如果你只有3名员工,我实际上不确定是否会考虑所有当地遗嘱执行人。但即使如此,问题是,你会得到什么
  • 关于这一点的一些一般性评论:如果您只有3个节点,那么从性能角度来看,使用比节点更多的worker并不会带来太多好处。唯一的性能优势是每个内部“调度程序线程”的负载更少(请参阅)。由于worker JVM本质上是多线程的,所以您可以将更多的执行器分配给单个worker——只要您的机器有足够的内核,您就可以获得所需的速度

    与可用节点相比,每个拓扑使用更多工作节点的主要目的实际上是获得更好的容错性。如果一个工作JVM失败,那么执行器就会减少。一个主管可以有多个工作JVM的原因是拓扑隔离。单身工人
    worker.heap.memory.mb: 4096