我使用事件时间戳在dataflow中创建了一个固定窗口为10分钟的新管道。因此,最初不会有消息,水印将是接近实时的。
现在假设在窗口10.10到10.20期间,在10.12,我开始发布频繁的消息,事件时间为10.12,持续20分钟,直到10.32。这是否意味着水印将保持在10.12到10.32,即使窗口时间超过10.20也不会前进,不会产生结果?
我只想了解水印在这种情况下会如何发展。是否等待事件时间为10.12的所有消息都被确认,事件时间大于10.12的新消息或休眠时间为2分钟。
我们在数据流中看到的数据水印是事件水印或系统水印
发布于 2021-04-23 03:01:02
当尝试考虑水印时,有两个单独的事情需要考虑:(1)水印来自哪里,(2)它是如何通过管道传播的。
对于(2),如果您使用的是标准固定窗口,则水印会被上游水印和窗口的时间戳中的最小值所抑制。例如,假设进入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,因为在该时间戳仍有数据(窗口)要发布。不管过了多少墙时间,水印都会被粘住。
<input watermark now at 10:22> [output watermark stays at 1:20]现在窗口被发布,随后输出水印前进。
<output window at 10:20> [output watermark stays at 1:20]
<output watermark advances to 10:22> [output watermark now at 1:22]
...至于(1),源负责发布带时间戳的数据和水印(例如“我保证不会在时间X之前发布带有时间戳的数据”)到管道中。对于如何“知道”未来元素的时间戳的界限,每个源都有自己的实现。IIRC,PubSub读取一个头部,并计算一个启发式的关于它期望在未来看到的消息。
https://stackoverflow.com/questions/67134688
复制相似问题