Flink:使用后期元素加水印

时间:2017-01-19 05:44:31

标签: apache-flink flink-streaming

我在Flink进行实时流式传输,其中Kafka是消息队列。我正在应用120秒的EventTimeSlidingWindow。并滑动1秒。我也在活动时间的每一秒插入水印。

我关注的是如果元素在水印之后会迟到会发生什么?现在我的情况,Flink简单地丢弃了各自水印之后的消息。是否有任何机制由filnk提供处理这样的延迟消息,比如维护单独的窗口?我也阅读了文档,但我没有弄明白。

3 个答案:

答案 0 :(得分:4)

Apache Flink有一个名为allowed lateness的概念,用于处理水印后到达的数据。

答案 1 :(得分:2)

默认情况下,当水印超过窗口末尾时,会删除延迟元素。但是,Flink允许为窗口运算符指定最大允许延迟。允许延迟指定元素在被删除之前可以延迟多少时间,并且其默认值为0.在水印已经过了窗口结束但在它通过窗口结束加上允许的延迟之后到达的元素,仍然被添加到窗口中。根据所使用的触发器,延迟但未丢弃的元素可能会导致窗口再次触发。这是EventTimeTrigger的情况。

为了使这项工作,Flink保持窗口的状态,直到他们允许的延迟到期。一旦发生这种情况,Flink将删除窗口并删除其状态。

另一个选项是SideOoutput,即除了由DataStream操作产生的主流之外,您还可以生成任意数量的附加侧输出结果流。结果流中的数据类型不必与主流中的数据类型匹配,并且不同侧输出的类型也可以不同。当您想要分割数据流时,此操作非常有用,您通常需要复制流,然后从每个流中过滤掉您不想拥有的数据。

使用侧输出时,首先需要定义一个OutputTag,用于标识侧输出流:

https://ci.apache.org/projects/flink/flink-docs-release-1.3/dev/stream/side_output.html

答案 2 :(得分:0)

允许的延迟可以导致多个输出。因此,从最后一个偶数开始的窗口结尾和水印结尾是一次,然后,对于每个元素晚了的另一个元素又进行了汇总输出。