在Storm Trident中发出多个流

时间:2015-11-20 23:22:12

标签: apache-storm trident

如何在Storm Trident中从同一个螺栓发射多个流?

我有一个螺栓可以进行一些计算,根据结果我想将一些值传递给一个流,并将一些其他值传递给另一个流。

在Storm(不是Trident)中,我们可以通过以下方式实现这一目标:

将流拆分为多个流:

@Override
public void declareOutputFields(final OutputFieldsDeclarer outputFieldsDeclarer) {
    outputFieldsDeclarer.declareStream("type1-stream", new Fields("type1"));
    outputFieldsDeclarer.declareStream("type2-stream", new Fields("type2"));
    outputFieldsDeclarer.declareStream("error-stream", new Fields("error"));
}

然后根据调查结果发出,如:

collector.emit("type1-stream", new Values("type 1 data"));
collector.emit("type2-stream", new Values("type 2 data"));
collector.emit("error-stream", new Values("error data"));

然后通过收听预期的流来完成剩下的工作:

builder.setBolt("errorBolt", errorBolt).shuffleGrouping("errorBoltStream", "error-stream");
builder.setBolt("type1Bolt", type1Bolt).shuffleGrouping("type1BoltStream", "type1-stream");

那么如何使用Storm Trident实现相同的行为?

一个选项是为同一个流调用“each”并运行相同的bolt并根据我想要发送到该流的内容发出,或者另一个选项将发出键和值对并根据键过滤流(像type1,type2,error等)并再次创建多个流。但在我看来,没有一个好的设计。实现它的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

AFAIK,你不能这样做。 要拆分流,您需要执行以下操作:

// main stream
Stream stream = topology.each(...)

// stream 01
Stream stream1 = stream.each(...)

// stream 02
Stream stream2 = stream.each(...)