答案 0 :(得分:0)
Bolt.execute()
,无论生成器是什么(并且您无法更改它)。如果要同时处理来自不同生产者的多个元组,则需要编写自定义UDF代码。
LinkedList<Tuple>
作为螺栓成员)input.getSourceComponent()
答案 1 :(得分:0)
您可能需要查看here(请参阅批处理)。对于处理更复杂操作(例如多个输入元组上的聚合)的螺栓,您需要扩展BaseRichBolt并自行控制锚定机制。
为此,您需要声明自己的输出收集器,如下所示:
private OutputCollector outputCollector;
然后通过覆盖prepare方法初始化它:
@Override
public void prepare(Map map, TopologyContext topologyContext, OutputCollector outputCollector) {
this.outputCollector = outputCollector;
}
您对BaseRichBolt的执行方法只接收一个元组作为参数,您需要能够执行逻辑来维护锚点并在发出时使用它们。
private final List<Tuple> anchors = new ArrayList<Tuple>();
@Override
public void execute(Tuple tuple) {
if (!isTupleAggregationComplete(anchors, tuple)) {
anchors.add(tuple);
return;
}
// do your computations here!
collector.emit(anchors, new Values(foo,bar,xpto));
anchors.clear();
}
您应该使用必要的逻辑来实现isTupleAggregationComplete,该逻辑检查螺栓是否具有继续处理所需的所有必要信息。