Bis*_*Ten 3 apache-flink flink-streaming
Flink 中关于事件时间处理的水印是什么?为什么需要它。?为什么在所有使用事件时间的情况下都需要它。在所有情况下,我的意思是如果我不进行窗口操作那么为什么我们仍然需要水印。我来自火花背景。在 Spark 中,仅当我们在传入事件上使用窗口时才需要水印。
我读过几篇文章,在我看来,水印和窗口似乎是一样的。如果有差异,请解释并指出
发表你的回复我做了更多阅读。下面是一个更具体的查询。
主要问题:- 当我们接受迟到时,为什么还需要乱序。
假设
您有一个 BoundedOutOfOrdernessTimestampExtractor,其边界为 2 分钟,滚动窗口为 10 分钟,该窗口从 12:00 开始,到 12:10 结束:
12:01, A
12:04, B
WM, 12:02 // 12:04 - 2 分钟
12:02、中
12:08、深
12:14、东
西 西、12:12
12:16、西
西、12:14 // 12:16 - 2 分钟
12:09、西
在上面的示例中,[12:02, C] 记录不会被删除,而是包含在窗口 12:00 -12:10 中并稍后进行评估。-因此,水印也可以是事件时间戳
仅当配置了可接受的迟到时间 5 分钟时,记录 [12:09, G] 才会包含在窗口 12:00 - 12:10 中。这可以处理延迟和无序事件
所以现在添加我上面的问题,outoforder 选项必须是某个值(0 除外)的 BoundedOutOfOrdernessTimestampExtractor 而不是事件时间戳 istelf 吗?
什么是乱序可以实现而 allowedlateness 不能实现的以及在什么情况下可以实现?
水印和窗口密切相关,但它们是非常不同的概念。
任何类型的基于事件的聚合都需要水印来切断迟到的事件。仅当 Windows 收到适当的水印并且发布聚合结果时,Windows 才能关闭。
如果没有乱序事件,则可以将水印设置为等于输入事件的时间戳。但这通常是一种奢侈。
编辑以解决评论中的问题。
保持水印持续时间等于窗口持续时间是一条经验法则吗,因为只有这样做才能计算并发出结果。
不,持续时间是独立的,但将给定事件的滞后相加。
您的水印持续时间取决于您的数据以及您的应用程序可以承受的延迟程度。假设大多数事件都按顺序进行,10% 的事件最多延迟 1 秒,另外 5% 的事件最多延迟 10 秒,1% 的事件最多延迟 1 小时。
如果将水印持续时间设置为 0,则 16% 的数据点将被丢弃,但 Flink 不会收到额外的延迟。如果您的水印落后事件 1 秒,您将丢失 6% 的数据,但结果将多延迟 1 秒。如果要保留所有数据,Flink 将需要在每次聚合上等待 1 小时,直到 Flink 可以确保没有数据丢失。
那么触发器的作用是什么呢?以及滑动窗口如何与水印和触发器协调。您能解释一下它们如何相互合作吗?
假设您有 1 分钟的窗口和 5 秒的水印延迟。仅当确定已看到所有相关数据时才会触发窗口。这种情况下,需要等待1分5秒才能触发,这样窗口的最后一个事件肯定已经到来。
顺便说一句,稍后作为水印的事件默认被丢弃。你可以改变这种行为。
| 归档时间: |
|
| 查看次数: |
3602 次 |
| 最近记录: |