当前位置: 首页 > 知识库问答 >
问题:

为什么Apache Flink需要水印来进行事件时处理?

巫马化
2023-03-14

有人能正确解释事件时间戳和水印吗。我从文件中理解了,但不太清楚。一个真实的例子或外行的定义会有所帮助。此外,如果可能,请给出一个示例(以及一些可以解释它的代码片段)。提前感谢

共有1个答案

华懿轩
2023-03-14

这里的一个例子说明了为什么我们需要水印,以及它们是如何工作的。

在本例中,我们有一个带有时间戳的事件流,这些事件的到达有些无序,如下所示。显示的数字是事件时间戳,指示这些事件实际发生的时间。第一个到达的事件发生在时间4,然后是更早发生的事件,发生在时间2,依此类推:

··· 23 19 22 24 21 14 17 13 12 15 9 11 7 2 4 →

现在想象一下,我们正在尝试创建一个流分类器。这意味着一个应用程序,它在流到达时处理来自流的每个事件,并发出一个包含相同事件的新流,但按它们的时间戳排序。

一些观察结果:

(1) 流分类器看到的第一个元素是4,但我们不能立即将其作为已排序流的第一个元素发布。它可能是无序到达的,可能还会出现更早的事件。事实上,我们对这条流的未来有着类似上帝的知识,我们可以看到,我们的流分类器至少应该等到2个到达后才能产生任何结果。

结论:一些缓冲和一些延迟是必要的。

(2) 如果我们做错了,我们可能会永远等下去。首先,我们的应用程序看到时间4的事件,然后是时间2的事件。时间戳小于2的事件是否会到达?大概也许不是。我们可以永远等待,永远不会看到1。

结论:最终我们必须勇敢地发出2作为排序流的开始。

(3)我们需要的是某种策略,它定义了对于任何给定的时间戳事件,何时停止等待早期事件的到来。

这正是水印所做的——它们定义了何时停止等待早期事件。

Flink中的事件时间处理依赖于水印生成器,该生成器将特殊的时间戳元素插入流中,称为水印。

什么时候我们的流分拣机应该停止等待,并推出2以启动分拣流?水印到达时的时间戳为2或更大。

(4) 我们可以想象不同的策略来决定如何生成水印。

我们知道,每一个事件都是在经过一些延迟之后到达的,并且这些延迟是不同的,因此有些事件的延迟比其他事件的延迟要大。一种简单的方法是假设这些延迟由某个最大延迟限定。Flink将这种策略称为有界无序水印。很容易想象更复杂的水印方法,但对于许多应用来说,固定延迟已经足够好了。

如果您想构建像流分类器一样的应用程序,Flink的KeyedProcessFunction是正确的构建块。它提供对事件时间计时器(即根据水印的到达触发的回调)的访问,并具有用于管理缓冲事件所需的状态的挂钩,直到轮到它们被发送到下游。

 类似资料:
  • Flink中关于事件时间处理的水印是什么?为什么需要它。?为什么在所有使用事件时间的情况下都需要它。在所有情况下,我的意思是,如果我不做窗户操作,那么为什么我们还需要一个水位线。我来自spark的背景。在spark中,只有在对传入事件使用windows时才需要水印。 我读过一些文章,在我看来,水印和窗口似乎是一样的。如果有差异,请解释并指出来 把你的回复贴出来,我读了一些。下面是一个更具体的查询<

  • 问题内容: 为什么在Hibernate中需要事务处理才能进行只读操作? 以下事务是否在数据库中设置了锁定? 从数据库获取示例代码: 我可以 代替使用吗? 问题答案: 你实际上可能有理由将事务标记为只读。 阅读交易看起来确实很奇怪,在这种情况下,人们通常不会标记交易方法。但是JDBC仍然会创建事务,只是如果未明确设置其他选项,它将可以正常工作。 但是,不能保证你的方法不会写入数据库。如果将metho

  • 我试图使用process函数对一组事件进行处理。我正在使用事件时间和键控流。我面临的问题是,水印值始终为9223372036854725808。我已经对print语句进行了调试,它显示如下: 时间戳------1583128014000提取时间戳1583128014000当前水印------9223372036854775808 时间戳------1583128048000提取时间戳1583128

  • 问题内容: 在React教程中,它说 这样做会立即发出警报,而不是在单击按钮时发出警报。 但是,我不明白为什么会这样…任何人都可以为我澄清一下吗?为什么不能将函数调用作为处理程序传递? 问题答案: 当您执行此操作时,将调用该函数并将返回的值()分配给该属性。所以,React看到的是这样说的: 嗯,那不是一个函数,为什么我要添加这样的处理程序? 您要传递的是一个函数,而不是。 因此,您必须做:可以像

  • 这可能是显而易见的事情,但我错过了。为什么我需要用0xff执行AND来获取ip地址?我的看法是完全一样的,用0xff执行AND应该让位保持不变,那么如果我不执行AND操作,为什么它不起作用呢?