当前位置: 首页 > 知识库问答 >
问题:

Apache Storm:LOCAL_OR_SHUFFLE不将工作推送到其他执行程序

陈宏胜
2023-03-14

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

3节点storm(V1.0.1)群集。显然,一个节点也是主节点,部署到AWS M3.2xLarge实例上。有12个工作人员(每个节点4个):

topology.workers: 12

每个工作者有4 GB的堆空间:

worker.heap.memory.mb: 4096

特别是我的一个bolt,让我们称之为:hashingbolt具有12的并行性提示。

这将创建12个执行器,每个执行器有一个任务(因为我正在使用Flux配置/部署)。hashingbolt的流类型为local_or_shuffle

当单击Storm UI中的hashingbolt时,我希望在Executors(All Time)部分下看到12行-每个Executors一行-每行都包含一些内容。

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

只有4个执行者做过任何事情。所有其他的都是空闲的,从不ACK/发射一个东西。我假设这是因为这4个执行者是本地的,他们是首选的。

现在,如果我将流类型更改为shuffle,那么--当然--所有执行程序都可以工作,吞吐量也会增加。

  1. 我的猜测正确吗?正在做某事的4个执行者是当地的吗?还是红鲱鱼?
  2. 为什么其他执行程序不在local_or_shuffle中使用?是不是因为4个执行器做的工作不够充分?
  3. 如果4个本地执行者没有得到足够的最大值,我如何使它如此?这与流缓冲区大小有关吗?我应该减少/增加等吗?
  4. 如果我将工作者的数量更改为3(每个节点一个),那么我会开始看到工作以local_or_shuffle模式被推送到远程工作者吗?

任何洞察力或建议都是非常感谢的。

除了下面所选的答案之外,我相信在具有平行度的螺栓上选择SHUFFLE,然后在后续螺栓上选择LOCAL_OR_SHUFFLE,也将确保所有工人保持忙碌,同时享受将后续工作保持在本地的潜在速度效益。

共有1个答案

苏晓博
2023-03-14
  1. 我很确定这是4个本地的(使用Storm UI,您可以单击一个螺栓,查看每个执行器部署在哪里,哪个执行器获得数据,哪个没有--因此您可以查看标识每个工作进程的主机/端口来验证这一点)
  2. 我想是的。使用Storm UI,您可以看到“Capacity”列,显示每个执行器的负载;以便您可以进行验证。
  3. 为什么要将它们最大?你会得到什么?
  4. 如果你只有3个工人,我实际上不确定是否会考虑所有的本地执行者。但即使这样,问题又是,你会得到什么?

关于这一点的一些一般性评论:如果您只有3个节点,从性能的角度来看,使用比节点更多的工作者买不到多少东西。唯一的性能优势是每个内部“dispatcher线程”的负载较少(参见http://www.michael-noll.com/blog/2013/06/21/commanding-storm-internal-message-buffers/)。由于worker JVM本质上是多线程的,您可以将更多的执行器分配给单个worker--只要您的机器有足够的内核,您就会获得您所希望的速度。

每个拓扑使用比可用节点更多的工作者的主要目的实际上是为了获得更好的容错能力。如果一个工作JVM失败,那么执行器就会减少。一个supervisor可以拥有多个工作JVM的原因是拓扑隔离。单个工作JVM将只执行来自单个拓扑的spouts/bolts。因此,如果要在一台主机上部署多个拓扑,则每个拓扑至少需要每个主机一个工作者。

关于local-or-shuffle:如果您使用local-of-shuffle,为什么您会担心不是所有的下游执行者都得到分配的工作呢?如果本地服务器可以处理负载,那么拓扑结构就可以正常运行...如果不能处理负载,数据将自动分配给其他数据。所以我不理解您对并非所有执行者都获得输入数据的担忧。

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

 类似资料:
  • 在过去的几天里,测试我情绪的问题是,尽管我的ESP8266芯片完全能够在while循环中通过parsePacket获取数据包,但当我既想监听传入的数据包,又想让我的ESP8266读取传感器并通过wifi发送这些数据包时,它完全忽略了这些。 所以我删掉了所有与传感器有关的内容,并在下面粘贴了代码,但下面是正在发生的事情。 在Setup()中,ESP设置wifi、SoftAP节点、UDP并进行配置 然

  • 我很难让这个代码正常工作。我学了很多,但我是个初学者。 这是剧本: //将新事件推送到日历函数pushToCalendar(){//电子表格变量 var sheet=SpreadsheetApp.getActiveSheet(); var range=sheet.getRange(1,1,5,25); var values=range.getValues(); 这里有一个到假人的链接: https

  • 我有一个Github repo项目,使用Github操作和一个docker文件来构建SpringBoot Java项目 我想从Github repo下载来自Github repo的定制工件包,并能够将工件上传到其中。 所以我按照配置Apache Maven用于GitHub包的链接,将该部分添加到settings.xml文件中: 为了从dockerfile构建中发布包,我在pom.xml中添加了以下

  • 从包A中,我从特权包B触发了正在运行的服务。包B执行包A的更新。目标设备正在使用Android 9(API Level 28)。更新成功(应用程序版本代码已更改)。但我的问题是更新后,包A在后台;在我的设备上,它在后台应用程序列表中,我必须手动按下它才能将其带到前台。 我希望它在安装后回到前台。 我尝试了什么: > 在安装后从包B向包a发送广播意图;看起来在包的广播接收器上没有接收到意图(可能是因

  • GraphRequest请求=GraphRequest。newGraphPathRequest(AccessToken.getCurrentAccessToken(),“/我/朋友”,new GraphRequest。Callback(){@Override public void onCompleted(GraphResponse response){//在此处插入代码 } 这是我的男拳。xml

  • 是否有一种方法可以扫描多个Google工作表,从键上的主工作表中找到匹配项,并在适用的情况下更新Google工作表中的单元格? 例如,下面我有4张。第一个是主人,其他的是孩子。如果来自Master的任何工作表的A列(倡议名称)上有匹配,则更新C列(金额)和D列(日期)中的单元格,否则保持工作表不变。在本例中,船长的倡议名称为“G”,金额为“50”,日期为“2020年1月4日”。儿童1的倡议名称为“