Storm并行理解

Storm parallel understanding

storm parallel的相关资料我都看过了,但还是有不明白的地方。假设我们以推文处理为例。通常我们所做的是检索推文流,计算每条推文的字数并将数字写入本地文件。

我的问题是如何理解 spouts 和 bolts 的平行度的价值。在 builder.setSpout 和 builder.setBolt 的函数中,我们可以分配并行值。但是在推文的字数统计的情况下,只设置一个 spout 是否正确?多个喷口被视为第一个相同喷口的副本,相同的推文通过这些喷口流入多个喷口。如果是这样的话,设置多个喷嘴的价值是什么?

还有一个不清楚的地方是如何给螺栓分配工程?并行机制是否以 Storm 的方式实现,将找到当前可用的螺栓来处理下一个发射喷口?我修改了基本的推文计数代码,所以最终的计数结果将被写入一个特定的目录,然而,所有的结果实际上都在 nimbus 上合并到一个文件中。因此,在处理主管的数据后,所有结果都将发送回 nimbus。如果这是真的,nimbus 和 supervisors 之间的沟通机制是什么?

我好想搞清楚那些问题!!!感谢您的帮助!!

在某些情况下,例如 "Kafka's Consumer Group",您有队列行为 - 这意味着如果一个消费者从队列中读取,其他消费者将从队列中读取不同的消息。 这会将队列中的读取负载分配给所有工作人员。 在这些情况下,您可以从队列中读取多个 spout

为大于 1 的 spout 设置并行度,需要用户代码为不同的实例做不同的事情。否则(正如您已经提到的),数据只会通过拓扑发送两次。例如,您可以有一个要监听的端口列表(或不同 Kafka 主题的列表)。因此,您需要确保不同的实例监听不同的端口或主题...这可以在 open(...) 方法中通过查看拓扑元数据(如自己的任务 ID 和 dop)来实现。由于每个实例都有一个唯一的 ID,您可以对 ports/topics 进行分区,以便每个实例从整个列表中选择不同的 ports/topics。

关于并行性:这取决于将拓扑连接在一起时使用的连接模式。例如,使用 shuffleGrouping 会导致将发出的元组循环分配给消耗的螺栓实例。对于这种情况,Storm 不会 "look" 如果有任何螺栓实例可用于处理。如有必要,元组只需在接收方传输和缓冲。

此外,Nimbus 和 Supervisor 只交换元数据。它们之间没有数据流(即元组流)。