数据流水印概念

Dataflow Watermark Concept

我使用事件时间戳在固定 window 10 分钟的数据流中创建了一个新管道。所以一开始不会有消息,水印会接近实时。

现在假设在 window 10 月 10 日到 10 月 20 日期间,在 10 月 12 日,我开始频繁发布事件时间为 10.12 的消息,持续 20 分钟,直到 10 月 32 日。这是否意味着水印将保持在 10.12 至 10.32,并且即使 window 时间超过 10.20 也不会发出结果?

我只是想了解水印在这种情况下将如何进行。它会等到所有事件时间为 10.12 的消息都被确认,并且事件时间超过 10.12 或休眠时间为 2 分钟的新消息。

而我们在dataflow中看到的数据水印是事件水印或者系统水印

在尝试考虑水印时,需要考虑两件不同的事情:(1) 水印的来源和 (2) 它如何通过管道传播。

对于 (2),如果您使用标准固定 windows,水印将被上游水印的最小值和 window 的时间戳阻止。例如。假设进入您的 GBK 的数据是

<input watermark now at 10:10>            [output watermark is 10:10]
<input element with timestamp 1:12>.      [output watermark stays at 1:10]
<input watermark now at 10:13>            [output watermark now at 1:13]
<input element with timestamp 1:17>       [output watermark stays at 1:13]
<input element with timestamp 1:23>       ...
<input element with timestamp 1:14>       [output watermark stays at 1:13]

此处此操作的输出水印将 1:13 被输入水印阻止。一旦系统确定到某个点的所有上游数据都已收到,它可以更新输入水印,但输出水印仍保持在10:20,因为还有数据(window)要发布在那个时间戳。不管过了多少walltime,水印都会被卡住。

<input watermark now at 10:22>            [output watermark stays at 1:20]

现在 window 已发布,随后输出水印会增加。

<output window at 10:20>                  [output watermark stays at 1:20]
<output watermark advances to 10:22>      [output watermark now at 1:22]
...

至于 (1),Source 负责将带时间戳的数据和水印(例如“我保证不会在时间 X 之前发布带有时间戳的数据”)发布到管道中。对于如何“了解”未来元素的时间戳的界限,每个来源都有自己的实现。 IIRC,PubSub 读取头部并计算关于它希望在未来看到的消息的启发式。