【问题标题】:Apache Storm: split a stream to different boltsApache Storm:将流拆分为不同的螺栓
【发布时间】:2017-05-21 18:24:06
【问题描述】:

我正在制作风暴拓扑,我正在处理这种格式的字符串:“x-x-x-x”,其中 x 是某个数字。我希望字符串流在 4 个螺栓之间平均分配。

问题是对于下面的代码,所有的bolt都得到了所有的元组,而不是发送eack tuple到一个bolt:

builder.setSpout("digits-spout", new ReaderSpout());
builder.setBolt("level-1", new SomeBolt(1)).shuffleGrouping("digits-spout");
builder.setBolt("level-2", new SomeBolt(2)).shuffleGrouping("digits-spout");
builder.setBolt("level-3", new SomeBolt(3)).shuffleGrouping("digits-spout");
builder.setBolt("level-4", new SomeBolt(4)).shuffleGrouping("digits-spout");

如您所见,我使用相同的螺栓但不同的构造函数。 谢谢!

【问题讨论】:

  • 你尝试过fieldsGrouping吗?您使用随机分组的任何具体原因?
  • fieldsGrouping 会将相同的 发送给相同的工作人员。我想要的是 4 个不同的 SomeBolt(i), 0

标签: apache-storm apache-storm-topology


【解决方案1】:

根据我从您的问题中了解到的情况,我可能会为您的问题提供一个额外的螺栓,例如以下示例:

builder.setSpout("digits-spout", new ReaderSpout());

builder.setBolt("stringSplitterBoltName", new 
StringSplitterBolt(1)).shuffleGrouping("digits-spout");

builder.setBolt("level-1", new 
SomeBolt(1)).shuffleGrouping("stringSplitterBoltName");

builder.setBolt("level-2", new 
SomeBolt(2)).shuffleGrouping("stringSplitterBoltName");

builder.setBolt("level-3", new 
SomeBolt(3)).shuffleGrouping("stringSplitterBoltName");

builder.setBolt("level-4", new 
SomeBolt(4)).shuffleGrouping("stringSplitterBoltName");

【讨论】:

    【解决方案2】:

    如果你想让bolt有不同的处理逻辑,你可以添加同一个bolt的4个task。在这种情况下,您将在螺栓实例之间随机收到消息。您可以检查该螺栓中的字符串值并采用适当的执行路径。您将避免为 4 个螺栓使用单独的代码库。

    或者,如果您想为字符串设置单独的螺栓代码,请参考 zackeriya 的上述建议。

    【讨论】:

      猜你喜欢
      • 2014-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多