Apache storm 当我使用storm时,如何确保具有多个输入的螺栓仅在所有输入到达时处理?
拓扑结构如下所示。 如何确保具有多个输入的bolt仅在所有输入到达时才进行处理?Apache storm 当我使用storm时,如何确保具有多个输入的螺栓仅在所有输入到达时处理?,apache-storm,Apache Storm,拓扑结构如下所示。 如何确保具有多个输入的bolt仅在所有输入到达时才进行处理?bolt.execute()将为每个传入元组调用,而不管生产者是什么(您无法更改此设置)。如果要同时处理来自不同生产者的多个元组,则需要编写自定义UDF代码 每个生产者都需要一个输入缓冲区,可以缓冲传入的元组(可能是一个LinkedList作为bolt成员) 对于每个传入的元组,您将元组添加到相应的缓冲区(您可以通过。input.getSourceComponent() 将元组添加到缓冲区后,检查每个缓冲区是否至少
bolt.execute()
将为每个传入元组调用,而不管生产者是什么(您无法更改此设置)。如果要同时处理来自不同生产者的多个元组,则需要编写自定义UDF代码
LinkedList
作为bolt成员)input.getSourceComponent()
您可能想看一看(请参阅批处理)。对于处理更复杂操作(如多个输入元组上的聚合)的螺栓,您需要扩展BaseRichBolt并自行控制锚定机制 为此,您需要声明自己的输出收集器,如下所示:
private OutputCollector outputCollector;
然后通过覆盖prepare方法对其进行初始化:
@Override
public void prepare(Map map, TopologyContext topologyContext, OutputCollector outputCollector) {
this.outputCollector = outputCollector;
}
BaseRichBolt的execute方法只接收一个元组作为参数,您需要能够执行逻辑来维护锚,并在发出锚时使用它们
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();
}
private final List anchors=new ArrayList();
@凌驾
公共void执行(元组){
如果(!isTupleAggregationComplete(锚定,元组)){
添加(元组);
返回;
}
//在这里做你的计算!
emit(锚、新值(foo、bar、xpto));
锚。清除();
}
您应该实现IStupleAggregation,并使用必要的逻辑检查螺栓是否具有继续处理所需的所有信息。您是否可以在此处指定
outputCollector
的用途?