【问题标题】:What is a watermark in Flink with respect to Event time processing? Why is it needed.?关于事件时间处理,Flink 中的水印是什么?为什么需要它。?
【发布时间】:2020-02-21 21:59:47
【问题描述】:

关于事件时间处理,Flink 中的水印是什么?为什么需要它。? 为什么在所有使用事件时间的情况下都需要它。在所有情况下,我的意思是如果我不进行窗口操作 那为什么我们还需要水印。 我来自火花背景。在 spark 中,只有当我们在传入事件上使用窗口时才需要水印。

看了几篇文章,觉得水印和windows好像是一样的,如有不同请说明并指出

发表你的回复我做了更多的阅读。下面是一个更具体的查询。
主要问题:- 当我们接受迟到时,为什么我们需要乱序。

给出下面的例子:
假设您有一个 BoundedOutOfOrdernessTimestampExtractor,其界限为 2 分钟,滚动窗口为 10 分钟,从 12:00 开始到 12:10 结束:
12:01,A
12:04, 乙
WM,12:02 // 12:04 - 2 分钟
12:02, C
12:08,D
12:14,E
WM,12:12
12:16,F
WM,12:14 // 12:16 - 2 分钟
12:09,G

在上面的示例中,[12:02, C] 记录没有被删除,而是包含在 12:00 -12:10 的窗口中并随后被评估。- 因此水印也可以是事件时间戳

只有在配置了 5 分钟的可接受延迟时,记录 [12:09, G] 才会包含在窗口 12:00 - 12:10 中。这会处理迟到和乱序的事件

所以现在添加到我上面的上一个问题,什么是 outoforder 选项的必要性是某个值(不是 0)的 BoundedOutOfOrdernessTimestampExtractor 而不是事件时间戳 istelf?
什么是乱序可以实现允许延迟不能实现的以及在什么场景下它可以实现?

【问题讨论】:

标签: apache-flink flink-streaming


【解决方案1】:

水印和窗口密切相关,但它们是非常不同的概念。

任何类型的基于事件的聚合都需要Watermarks 来切断延迟事件。 Windows 只能在收到适当的水印并且发布聚合结果时关闭。

如果您没有乱序事件,您可以将水印设置为等同于输入事件的时间戳。但这通常是一种奢侈。


编辑以解决评论中的问题。

保持水印持续时间等于窗口持续时间是否是一个经验法则,因为只有这样做才会计算和发出结果。

不,持续时间是独立的,但会将给定事件的延迟相加。

您的水印持续时间取决于您的数据以及您的应用程序可以延迟多少。假设大多数事件都是按顺序进行的,10% 迟到 1 秒,另外 5% 迟到 10 秒,1% 迟到 1 小时。

如果您将水印持续时间设置为 0,那么 16% 的数据点将被丢弃,但 Flink 不会收到额外的延迟。如果您的水印落后于您的事件 1 秒,您将丢失 6% 的数据,但结果会多延迟 1 秒。如果要保留所有数据,Flink 每次聚合都需要等待 1h,直到 Flink 可以确定没有数据丢失。

那么触发器的作用是什么?以及滑动窗口如何与水印和触发器协调。你能解释一下他们是如何相互合作的吗?

假设您有 1 分钟的窗口和 5 秒的水印延迟。仅当确定已查看所有相关数据时才会触发窗口。在这种情况下,它需要等待1分5秒才能触发,这样窗口的最后一个事件肯定已经到了。

默认情况下,稍后作为水印的 Btw 事件将被丢弃。 You can change that behavior.

【讨论】:

  • “Windows 只能在收到适当的水印并且发布聚合结果时关闭。” - 按照这个说法,保持水印持续时间等于窗口持续时间是一个经验法则,因为只有这样做,才会计算并发出结果。但是触发器的作用是什么?以及滑动窗口如何与水印和触发器协调。你能解释一下他们是如何相互合作的吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-27
  • 1970-01-01
  • 1970-01-01
  • 2010-12-08
  • 2011-04-05
  • 2015-07-04
相关资源
最近更新 更多