【问题标题】:Flink: Watermarking with Late ElementsFlink:带有后期元素的水印
【发布时间】:2017-01-19 05:44:30
【问题描述】:
我在 Flink 中进行实时流式传输,其中 Kafka 是消息队列。我正在应用 120 秒的 EventTimeSlidingWindow。和 1 秒的幻灯片。我还在事件时间的每一秒插入水印。
我担心的是如果元素在水印之后迟到会发生什么?现在我的情况是,Flink 只是丢弃了在其各自水印之后的消息。 filnk 是否提供了任何机制来处理此类延迟消息,例如维护单独的窗口?我也浏览了文档,但我并不清楚。
【问题讨论】:
标签:
apache-flink
flink-streaming
【解决方案2】:
默认情况下,当水印超过窗口末尾时,后期元素会被丢弃。但是,Flink 允许为窗口操作符指定最大允许延迟。 Allowed lateness 指定元素在被删除之前可以延迟多少时间,其默认值为 0。在 watermark 超过窗口结束但在它通过窗口结束之前到达的元素加上允许的延迟,仍然添加到窗口中。根据使用的触发器,迟到但未删除的元素可能会导致窗口再次触发。 EventTimeTrigger 就是这种情况。
为了完成这项工作,Flink 会保持窗口的状态,直到它们允许的延迟到期。一旦发生这种情况,Flink 就会移除窗口并删除其状态。
另外一个选项是 SideOoutput,即除了由 DataStream 操作产生的主流之外,您还可以生成任意数量的附加侧输出结果流。结果流中的数据类型不必与主流中的数据类型匹配,并且不同侧输出的类型也可以不同。当您想要拆分通常必须复制流的数据流,然后从每个流中过滤掉您不希望拥有的数据时,此操作会很有用。
使用侧输出时,首先需要定义一个 OutputTag 用于标识侧输出流:
https://ci.apache.org/projects/flink/flink-docs-release-1.3/dev/stream/side_output.html
【解决方案3】:
允许的延迟可能会导致多个输出。因此,最后一个事件的窗口结束和水印结束是一次,然后对于每个迟到的元素,另一个聚合输出。