Flink:带有后期元素的水印
Flink: Watermarking with Late Elements
我在Flink做实时流,Kafka是消息队列。我正在应用 120 秒的 EventTimeSlidingWindow。和 1 秒的幻灯片。我还在事件时间的每一秒插入水印。
我担心的是如果元素迟到,在水印之后会发生什么?现在我的情况是,Flink 只是丢弃其各自水印之后的消息。 filnk 是否提供任何机制来处理此类延迟消息,例如维护单独的 window?我也浏览了文档,但我不清楚。
Apache Flink 有一个名为 allowed lateness 的概念,用于 windows 处理水印之后到达的数据。
默认情况下,当水印超过 window 末尾时,迟到的元素将被删除。但是,Flink 允许为 window 运算符指定最大允许延迟。 Allowed lateness 指定元素在被删除之前可以延迟多长时间,其默认值为 0。在水印通过 window 结束之后但在通过 [= 结束之前到达的元素22=]加上允许的迟到,仍然加到window。根据使用的触发器,延迟但未删除的元素可能会导致 window 再次触发。 EventTimeTrigger 就是这种情况。
为了使这项工作正常进行,Flink 保持 windows 的状态,直到他们允许的迟到期满。一旦发生这种情况,Flink 将删除 window 并删除其状态。
另外一个选项是 SideOoutput,即除了 DataStream 操作产生的主流之外,您还可以产生任意数量的附加副输出结果流。结果流中的数据类型不必与主流中的数据类型匹配,不同侧输出的类型也可以不同。当您想要拆分数据流时,此操作非常有用,而您通常必须复制该流,然后从每个流中过滤掉您不想要的数据。
使用侧输出时,首先需要定义一个 OutputTag,用于标识侧输出流:
https://ci.apache.org/projects/flink/flink-docs-release-1.3/dev/stream/side_output.html
允许的迟到会导致多个输出。所以 window 的结尾和最后一个偶数的水印的结尾是一次,然后对于每个迟到的元素,另一个聚合输出。
我在Flink做实时流,Kafka是消息队列。我正在应用 120 秒的 EventTimeSlidingWindow。和 1 秒的幻灯片。我还在事件时间的每一秒插入水印。
我担心的是如果元素迟到,在水印之后会发生什么?现在我的情况是,Flink 只是丢弃其各自水印之后的消息。 filnk 是否提供任何机制来处理此类延迟消息,例如维护单独的 window?我也浏览了文档,但我不清楚。
Apache Flink 有一个名为 allowed lateness 的概念,用于 windows 处理水印之后到达的数据。
默认情况下,当水印超过 window 末尾时,迟到的元素将被删除。但是,Flink 允许为 window 运算符指定最大允许延迟。 Allowed lateness 指定元素在被删除之前可以延迟多长时间,其默认值为 0。在水印通过 window 结束之后但在通过 [= 结束之前到达的元素22=]加上允许的迟到,仍然加到window。根据使用的触发器,延迟但未删除的元素可能会导致 window 再次触发。 EventTimeTrigger 就是这种情况。
为了使这项工作正常进行,Flink 保持 windows 的状态,直到他们允许的迟到期满。一旦发生这种情况,Flink 将删除 window 并删除其状态。
另外一个选项是 SideOoutput,即除了 DataStream 操作产生的主流之外,您还可以产生任意数量的附加副输出结果流。结果流中的数据类型不必与主流中的数据类型匹配,不同侧输出的类型也可以不同。当您想要拆分数据流时,此操作非常有用,而您通常必须复制该流,然后从每个流中过滤掉您不想要的数据。
使用侧输出时,首先需要定义一个 OutputTag,用于标识侧输出流:
https://ci.apache.org/projects/flink/flink-docs-release-1.3/dev/stream/side_output.html
允许的迟到会导致多个输出。所以 window 的结尾和最后一个偶数的水印的结尾是一次,然后对于每个迟到的元素,另一个聚合输出。