Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/19.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 flink 如何在flink中毫不延迟地发出处理事件的结果_Apache Flink_Flink Streaming - Fatal编程技术网

Apache flink 如何在flink中毫不延迟地发出处理事件的结果

Apache flink 如何在flink中毫不延迟地发出处理事件的结果,apache-flink,flink-streaming,Apache Flink,Flink Streaming,我们正在考虑将flink作为用例,但不确定flink是否适合它。这是我的用例。当事件e1到达时,我们需要处理它并发出结果。源和接收器与本讨论无关,但您可以将消息队列服务视为源和接收器。事件的整个处理过程独立于其他事件。因此,在处理事件e1时,我们不需要e2或任何其他事件。作为处理的一部分,我们需要执行步骤1、步骤2、步骤3、步骤4,如下图所示。请注意,步骤2和步骤3应并行执行 事件的处理延迟对我们来说至关重要。因此,我需要在该元素的处理完成后立即发出结果,而不是等待某个窗口超时。由于我对弗林克

我们正在考虑将flink作为用例,但不确定flink是否适合它。这是我的用例。当事件e1到达时,我们需要处理它并发出结果。源和接收器与本讨论无关,但您可以将消息队列服务视为源和接收器。事件的整个处理过程独立于其他事件。因此,在处理事件e1时,我们不需要e2或任何其他事件。作为处理的一部分,我们需要执行步骤1、步骤2、步骤3、步骤4,如下图所示。请注意,步骤2和步骤3应并行执行

事件的处理延迟对我们来说至关重要。因此,我需要在该元素的处理完成后立即发出结果,而不是等待某个窗口超时。由于我对弗林克的了解有限,我只能想到下面的方法

DataStream<Map<String, Object>> step1 = env.addSource(...);
DataStream<Map<String, Object>> step2 = step1.map(...);
DataStream<Map<String, Object>> step3 = step1.map(...);
DataStream step1=env.addSource(…);
DataStream step2=step1.map(…);
DataStream step3=step1.map(…);
现在,如何组合步骤2和步骤3的结果并发出结果?在这个简单的例子中,我只有两个蒸汽要合并,但也可以超过2个。我可以把溪流结合起来。我可以有一个唯一的事件id来对与特定事件相关的中间步骤的输出进行分组

DataStream<Map<String, Object>> mergedStream = step1.union(step2).keyBy(...);
datastreammergedstream=step1.union(step2.keyBy(…);
但如何发射结果呢?理想情况下,我想说“当我从步骤2和步骤3获得特定键的输出时立即发出结果”,而不是“每30毫秒发出一次结果”。后者有两个问题:它可能会发出部分结果,并且有延迟。有没有办法具体说明前者?
我正在探索弗林克,但是如果它解决了我的用例,我会考虑其他的选择。

< P>在步骤1中,添加事件ID。然后在合并之后,用事件ID来键入流,并使用RiffFrimeApple函数将步骤2和3的结果组合成单个事件。如果步骤2和3发出EnrichedEvent类型的事件,则步骤4可以是:

static class FanIn extends RichFlatMapFunction<EnrichedEvent, EnrichedEvent> {
    private transient ValueState<EnrichedEvent> enrichmentResponseState;

    @Override
    public void flatMap(EnrichedEvent value, Collector<EnrichedEvent> out) throws Exception {
        EnrichedEvent response = enrichmentResponseState.value();

        if (response != null) {
            response = response.combine(value);
        } else {
            response = value;
        }

        if (response.isComplete()) {
            out.collect(response);
            enrichmentResponseState.clear();
        } else {
            enrichmentResponseState.update(response);
        }
    }

    @Override
    public void open(Configuration config) {
        ValueStateDescriptor<EnrichedEvent> fanInStateDescriptor =
            new ValueStateDescriptor<>( "enrichmentResponse",
                TypeInformation.of(new TypeHint<EnrichedEvent>() {})
            );

        enrichmentResponseState = getRuntimeContext().getState(fanInStateDescriptor);
    }
}
静态类FanIn扩展了RichFlatMapFunction{
私有瞬时值状态丰富了中央响应状态;
@凌驾
public void flatMap(EnrichedEvent值,收集器输出)引发异常{
EnrichedEvent response=enrichmentResponseState.value();
if(响应!=null){
响应=响应。组合(值);
}否则{
响应=值;
}
if(response.isComplete()){
输出。收集(响应);
enrichmentResponseState.clear();
}否则{
enrichmentResponseState.update(响应);
}
}
@凌驾
公共无效打开(配置){
ValueStateDescriptor FanInstatedDescriptor=
新的ValueStateDescriptor(“enrichmentResponse”,
TypeInformation.of(新的TypeHint(){})
);
enrichmentResponseState=getRuntimeContext().getState(FanStatedDescriptor);
}
}

之后,将合并的最终结果发送到接收器是一件简单的事情。

因此您希望处理步骤1,然后并行处理任意数量的步骤,然后处理一个最终步骤,其中最终步骤在发出结果之前需要每个并行步骤的结果?正确。在最后一步中,我将合并所有并行步骤的结果。谢谢-David击败了我,下面有一个很好的答案。谢谢你的答案。它可以工作,但是延迟比我预期的要多。它遵循一种奇怪的模式,好像它在缓冲事物。我为此发布了一个不同的问题:。请看你能否回答。