Apache storm 在暴风雨中向单个螺栓发送两个螺栓的输出?

Apache storm 在暴风雨中向单个螺栓发送两个螺栓的输出?,apache-storm,Apache Storm,将BoltA和BoltB的输出发送到BoltC的最简单方法是什么。我是否必须使用联接,或者是否有更简单的解决方案。A和B具有相同的字段(ts、度量单位名称、度量单位计数) 这可能吗 是的。只需将流id(“下面的stream1”和“stream2”)添加到FieldsGroup调用: BoltDeclarer bd = builder.setBolt(AGGREGATE_BOLT_ID, aggregateBolt, 5); bd.fieldsGrouping((COUNT_BOLT_ID),

将BoltA和BoltB的输出发送到BoltC的最简单方法是什么。我是否必须使用联接,或者是否有更简单的解决方案。A和B具有相同的字段(ts、度量单位名称、度量单位计数)


这可能吗

是的。只需将流id(“下面的stream1”和“stream2”)添加到FieldsGroup调用:

BoltDeclarer bd = builder.setBolt(AGGREGATE_BOLT_ID, aggregateBolt, 5); 
bd.fieldsGrouping((COUNT_BOLT_ID), "stream1",  new Fields("ts"));
bd.fieldsGrouping((HTTP_RES_CODE_COUNT_BOLT_ID), "stream2", new Fields("ts"));
然后在BoltC的execute()方法中,您可以测试元组来自哪个流:

public void execute(Tuple tuple) {

    if ("stream1".equals(tuple.getSourceStreamId())) {
        // this came from stream1
    } else if ("stream2".equals(tuple.getSourceStreamId())) {
        // this came from stream2
    }
因为您知道元组来自哪个流,所以不需要在两个流上具有相同的元组形状。您只需根据stream-id对元组进行反马歇尔处理


您还可以检查元组来自哪个组件(当我键入这个时,我认为这可能更适合您的情况)以及发出元组的组件(任务)的实例。

正如@Chris所说,您可以使用streams。但您也可以简单地从元组中获取源组件

@Override
public final void execute(final Tuple tuple) {
    final String sourceComponent = tuple.getSourceComponent();
    ....
}

源组件是您在拓扑初始化时为螺栓指定的名称。例如:COUNT_BOLT_ID.

如果您像上面的代码那样更改代码,它将在线程“main”java.lang.IllegalArgumentException中抛出类似异常的错误:BOLT已经为id@Mouli我也犯了同样的错误。您找到解决方案了吗?@Inderpal编辑了我的答案,为螺栓创建了一个螺栓declarer,然后使用该引用定义了两个输入流。不确定此代码何时停止工作。
@Override
public final void execute(final Tuple tuple) {
    final String sourceComponent = tuple.getSourceComponent();
    ....
}