Google cloud dataflow 数据流水印概念

Google cloud dataflow 数据流水印概念,google-cloud-dataflow,apache-beam,Google Cloud Dataflow,Apache Beam,我使用事件时间戳在dataflow中创建了一个固定窗口为10分钟的新管道。因此,最初不会有消息,水印将接近实时 现在假设在10.10到10.20期间,在10.12我开始发布频繁消息,事件时间为10.12,持续20分钟,直到10.32。这是否意味着水印将保持在10.12到10.32之间,并且即使窗口时间超过10.20也不会前进,并且不会发出结果 我只是想了解在这种情况下水印将如何发展。它将等待事件时间为10.12的所有消息被确认,并等待事件时间超过10.12或睡眠时间为2分钟的新消息 和我们在数据

我使用事件时间戳在dataflow中创建了一个固定窗口为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]
[输出水印为10:10]
.      [输出水印保持在1:10]
[现在在1:13输出水印]
[输出水印保持在1:13]
...
[输出水印保持在1:13]
此处,此操作的输出水印将被输入水印保留为1:13。一旦系统确定接收到某一点的所有上游数据,它可以更新输入水印,但输出水印保持在10:20,因为在该时间戳处仍有数据(窗口)要发布。不管walltime经过多少时间,水印都会被粘贴

<input watermark now at 10:22>            [output watermark stays at 1:20]
[输出水印保持在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:20]
[现在在1:22输出水印]
...
至于(1),源负责将时间戳数据和水印(例如,“我承诺不会在时间X之前发布带有时间戳的数据”)发布到管道中。每个源都有自己的实现,用于如何“知道”未来元素的时间戳的绑定。在IIRC中,PubSub读取一个头部,并计算一个关于它期望在未来看到什么消息的启发式算法