【问题标题】:Which method should I use to implement this Storm topology?我应该使用哪种方法来实现这个 Storm 拓扑?
【发布时间】:2015-03-05 17:00:23
【问题描述】:

我想在 Storm 中实现如下拓扑:

a1->a2->a3->a4
    |        |
     -<----<--


b1->b2->b3->b4
    |        |
     -<----<--

注意 a1、b1 和 a2、b2 等是相同的螺栓。有两个相同的流,但在螺栓之间传递的元组必须保留在流中。还有一个从a4->a2,b4->b2引出的循环。

为了实现单独的流,我想到了在 streamID 字段上使用 fieldsGrouping 或为每个流创建单独的 streamID。后一种选择似乎更好,但我在下面的实现似乎不优雅。

builder.setBolt("a2", new A2(), 1).shuffleGrouping("a1", "streamA"); 
builder.setBolt("b2", new B2(), 1).shuffleGrouping("b1", "streamB"); 

然后继续以同样的方式实现第二个要求:

builder.setBolt("a2", new A2(), 1).shuffleGrouping("a4", "stream1"); 

有没有更好的办法?

【问题讨论】:

  • 您能否从 A4 生成一个元素,该元素将在 A1 中作为 spout 元组进行检查,而不是在 A2 中作为循环进行检查?或者,是对 A4 到 A2(不等于 A1 到 A2)进行的完全不同的操作吗?
  • 对不起,我不明白这个问题。流中发生的事情是 a1、a2、a3 和 a4 正在按顺序处理一条消息。 a4 可能会定期接收来自下游的消息(我的图中未显示),然后它必须将其传递给 a2。
  • 你应该记录这个案例,我觉得应该有更好的事情要做。恕我直言,您不应该在一个螺栓中“煎饼”问题。如果可能的话,最好将这种情况分开在另一个螺栓/流中。

标签: apache-storm


【解决方案1】:

我在您的实现中看到的唯一问题是您有 2 个 A2 实例,这是不必要的。你可以

builder.setBolt("a2", new A2(), 1)
       .shuffleGrouping("a1", new Fields("streamA") )
       .shuffleGrouping("a4", new Fields("stream1") );

【讨论】:

    【解决方案2】:

    我最终使用了 directGrouping 和不同的流。所以有一个流从 a1->a2->a3->a4 流向,另一个流从 a4->a2 流向。这样我可以确保 A 组和 B 组之间没有元组传递。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多