我使用事件时间戳在数据流中创建了一个新管道,固定窗口为 10 分钟。因此最初不会有任何消息,并且水印将接近实时。
现在假设在 10.10 到 10.20 的窗口期间,在 10.12,我开始频繁发布事件时间为 10.12 的消息,持续 20 分钟,直到 10.32。这是否意味着水印将保持在 10.12 到 10.32,即使窗口时间超过 10.20,也不会前进,并且不会发出结果?
我只是想了解水印在这种情况下将如何进展。是否会等到事件时间为 10.12 的所有消息都被确认并且事件时间大于 10.12 的新消息或休眠时间为 2 分钟。
而我们在数据流中看到的数据水印是事件水印或系统水印
最佳答案
在尝试考虑水印时,需要考虑两个不同的事情:(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,因为在该时间戳仍有数据(窗口)要发布。无论walltime过去多少时间,水印都会被卡住。
<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 之前发布带有时间戳的数据”)发布到管道中。每个源都有自己的实现,用于如何“了解” future 元素的时间戳的界限。 IIRC,PubSub 读取头部并计算其期望在未来看到的消息的启发式。
关于google-cloud-dataflow - 数据流水印概念,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67134688/