如果我在将某个操作符保持在状态一段时间后发出一个事件,如果它超过了水印,下游操作符会接受它吗?

问题描述 投票:0回答:1

我有一个由两个来源组成的 flink 作业。

两个源通过连接键关闭,并且过程函数连接两个流。有时数据可能会延迟 15 分钟。因此,我使用计时器将数据保持在状态 15 分钟,然后在 15 分钟后发出事件。在大多数情况下,我不会将事件保持在状态中,它会立即加入并发出,但在某些情况下,它可能会保持状态 15 分钟

现在源头的水印不断流过。我的问题是,如果这个事件在 15 分钟后加入并发出,它会被下游操作员接受吗?让我们说“sink”。

我看到它正在被接受。如果我查看接收器的下水位线,它会高于延迟发出的事件的事件时间(15 分钟)。水印较高的原因是,尽管某些事件在该状态中停留了 15 分钟,但其他事件仍以较高的时间戳继续流过。所以水印一直向上移动。

我只是想知道为什么接收器要接受这个超过其水印的事件

apache-flink flink-streaming
1个回答
0
投票

如果我在将某个操作符保持在状态一段时间后发出一个事件,如果它超过了水位线,下游操作符会接受它吗?

这取决于下游运营商的行为。

有些运营商关注时间戳和水印,有些则不关注。受水印影响的运营商包括

  • 窗户
  • 时间和区间连接
  • CEP 和 match_recognize

在某些情况下,这些运算符会默默地丢弃延迟事件,并且在某些情况下,这些运算符提供将延迟事件发送到侧面输出的选项。 DataStream 窗口可以处理延迟事件并重新发出其结果,直到延迟事件超过“允许的延迟”。

这些操作员这样做的原因是他们保留着最终必须清除的状态,并且他们依靠水印来知道何时应该清除其状态。

其他算子,例如接收器、地图和过滤器,不关心时间戳和水印。这些操作员不会面临积累过多状态的危险,因此无论事件是否迟到,他们都会处理所有事件。

© www.soinside.com 2019 - 2024. All rights reserved.