google-cloud-dataflow - 数据流水印概念

标签 google-cloud-dataflow apache-beam

我使用事件时间戳在数据流中创建了一个新管道,固定窗口为 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/

相关文章:

java - 使用 Java SDK 检查数据流作业(异步)状态

java - 使用向后兼容的编码器更改编码器以进行转换

google-cloud-platform - 从有界数据流管道到发布/订阅的确定性发布顺序

java - 在固定窗口内对元素进行排序 - Cloud Dataflow

java - 光束 : writing per window element count with window boundaries

java - GenericRecord 的 Avro 架构 : Be able to leave blank fields

google-cloud-dataflow - 在Apache Beam中寻找与文件模式匹配的新文件

python-2.7 - 如何将参数传递给数据流模板以进行管道构建

google-cloud-dataflow - 导入错误 : No module named options. value_provider

google-cloud-dataflow - 如何在 Beam 2.0 中的复合 PTransform 中获取 PipelineOptions?