Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache storm 当我使用storm时,如何确保具有多个输入的螺栓仅在所有输入到达时处理?_Apache Storm - Fatal编程技术网

Apache storm 当我使用storm时,如何确保具有多个输入的螺栓仅在所有输入到达时处理?

Apache storm 当我使用storm时,如何确保具有多个输入的螺栓仅在所有输入到达时处理?,apache-storm,Apache Storm,拓扑结构如下所示。 如何确保具有多个输入的bolt仅在所有输入到达时才进行处理?bolt.execute()将为每个传入元组调用,而不管生产者是什么(您无法更改此设置)。如果要同时处理来自不同生产者的多个元组,则需要编写自定义UDF代码 每个生产者都需要一个输入缓冲区,可以缓冲传入的元组(可能是一个LinkedList作为bolt成员) 对于每个传入的元组,您将元组添加到相应的缓冲区(您可以通过。input.getSourceComponent() 将元组添加到缓冲区后,检查每个缓冲区是否至少

拓扑结构如下所示。

如何确保具有多个输入的bolt仅在所有输入到达时才进行处理?

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
    的用途?