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

Flink中关于事件时间处理的水印是什么?为什么需要它。?

樊俊悟
2023-03-14

Flink中关于事件时间处理的水印是什么?为什么需要它。?为什么在所有使用事件时间的情况下都需要它。在所有情况下,我的意思是,如果我不做窗户操作,那么为什么我们还需要一个水位线。我来自spark的背景。在spark中,只有在对传入事件使用windows时才需要水印。

我读过一些文章,在我看来,水印和窗口似乎是一样的。如果有差异,请解释并指出来

把你的回复贴出来,我读了一些。下面是一个更具体的查询<主要问题:-当我们接受迟到时,为什么我们需要无序。

给出以下示例:
假设您有一个BoundedAutofordernessTimestampExtractor,它有一个2分钟的边界和一个10分钟的翻滚窗口,从12:00开始到12:10结束:
12:01,a
12:04,B
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分钟的AcceptedLatenness时,记录[12:09,G]才会包含在12:00-12:10窗口中。这会处理延迟和无序事件

那么现在,除了我前面的问题之外,有什么必要将outoforder选项绑定为某个值(0除外)的ErnessTimestampExtractor,而不是事件时间戳istelf<无序能实现什么,允许延迟不能实现什么,在什么情况下它能实现什么?

共有1个答案

罗甫
2023-03-14

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

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

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

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

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

不,持续时间是独立的,但将给定事件的滞后时间相加。

您的水印持续时间取决于您的数据以及应用程序可以承受的延迟时间。假设大多数活动都是有序的,10%的活动迟到1秒,另外5%的活动迟到10秒,1%的活动迟到1小时。

如果将水印持续时间设置为0,则会丢弃16%的数据点,但Flink不会收到额外的延迟。如果水印落后事件1s,则会丢失6%的数据,但结果会有1s的延迟。如果要保留所有数据,Flink需要在每次聚合上等待1小时,直到Flink确定没有数据丢失为止。

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

比方说,您有一个1分钟的窗口和一个5秒的水印延迟。只有在确定所有相关数据都已被看到时,才会触发一个窗口。在这种情况下,需要等待1分钟5秒才能触发,这样窗口的最后一个事件肯定已经到达。

默认情况下,将丢弃稍后作为水印的Btw事件。你可以改变这种行为。

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

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

  • 如果用户用鼠标单击了按钮对象button,则该按钮button就是事件源,而java运行时系统会生成ActionEvent类的对象actionE,该对象中描述了该单击事件发生时的一些信息,然后,事件处理者对象将接收由java运行时系统传递过来的事件对象actionE并进行相应的处理。

  • null 此窗口具有一个允许延迟为一分钟的BoundedOutoFordernesTimeStampExtractor。 水印:据我的理解,Flink和Spark结构化流中的水印定义为(max-event-timestamp-seen-so-far-alloged-lateness)。事件时间戳小于或等于此水印的任何事件都将被丢弃并在结果计算中忽略。 在此场景中,几个事件到达Flink运算符时具有

  • 我们正在接收来自多个独立数据源的事件,因此,到达我们Flink拓扑(通过Kafka)的数据将是无序的。 我们正在Flink拓扑中创建1分钟的事件时间窗口,并在源操作符处生成事件时间水印(当前事件时间-某些阈值(30秒))。 如果一些事件在设置的阈值之后到达,那么这些事件将被忽略(在我们的例子中这是可以的,因为属于该分钟的大多数事件都已经到达并在相应的窗口中得到处理)。 现在的问题是,如果程序崩溃(

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