风暴流以并行方式加入

storm stream joins with parallelism

我有两个 spout 并且都在发出一些数据

Spout A tuple-> pid, data1, data2, data3
Spout B tuple -> pid, m1, m2

我想用 bolt over 连接上面两个 spout 的数据 "pid"

Spout A
   |------------------> joinBolt ----> pid, data1, data2, data3, m1, m2
Spout B

JoinBolt 将合并 "pid" 上的数据并发出元组 (pid, data1, data2, data3, m1, m2)

JoinBolt joinBolt = new JoinBolt()
BoltDeclarer bd = builder.setBolt("joinBoltId", joinBolt, 5); 
bd.fieldsGrouping("spout1Id" "stream1",  new Fields("pid"));
bd.fieldsGrouping("spout2Id", "stream2", new Fields("pid"));

如果我在 JoinBolt 中的并行度为 5,我能否确保来自具有相同 pid 的两个 spout 的数据将落在同一个 joinBolt 实例上。

在这种情况下,由于并行度为 5,因此我将拥有 5 个 joinBolt 实例(比如 b1、b2、b3、b4、b5)。现在是否有可能来自 spout1 的 pid1 和来自 spout2 的 pid1 可以转到不同的 joinBolt 实例,即使我已经在 pid 上设置了 fieldsGrouping?

如果您在 pid 上使用 fieldsGrouping,对于相同的值 pid,它将转到相同的 JoinBolt 实例。 仅供参考,Storm 添加了基于窗口的 JoinBolt 功能 https://github.com/apache/storm/blob/master/storm-core/src/jvm/org/apache/storm/bolt/JoinBolt.java