数据流覆盖处理时间

ece*_*ena 0 google-cloud-dataflow

有没有办法覆盖数据流中的处理时间(而不是事件时间)?

我试图推理故障场景,以及如何重新计算管道的输出。

假设我有一个管道,它只是对收到的事件进行计数,固定窗口为 1 小时,允许延迟 2 小时。假设我对窗口 [t0, t0+1h) 感兴趣,并假设我有:

  • 事件A,事件时间=t0+10m,处理时间=t0+30m
  • 事件B,事件时间=t0+10m,处理时间=t0+90m

然后对事件A进行计数,并丢弃事件B。

现在,假设几天后我​​发现代码中存在错误,并且我想重新运行管道以重新计算过去同一窗口 [t0, t0+1h) 中的事件。如果现在的处理时间 = t0 + 几天,则所有事件都将被丢弃。

如果我忽略允许的迟到(假设无限),则事件 A 和 B 都会被计数。

通过覆盖处理时间(假设我第一次存储它),我可以确保事件 A 被计数而事件 B 不被计数。有没有办法做到这一点?谢谢!

Fra*_*ces 5

处理时间是元素到达系统进行处理的时间。水印跟踪我们在输入流中相对于元素事件时间的位置。

水印通常只是一种启发式方法,因此当出现错误且元素出现时间早于预期时,这些元素将被标记为较晚。水印有可能落后于处理时间,因此元素可能会在延迟后到达,但仍然不会被标记为延迟。例如,如果用户正在玩手机游戏,水印可能会针对导致多个延迟事件的大幅网络减速进行调整。在这种情况下,实际上没有元素可以被认为是迟到的。但水印不会针对偶尔在离线模式下玩游戏的用户进行调整,因此这可能会导致数据延迟。有关水印和数据流模型的有用背景,请参阅以下文章:Streaming 101Streaming 102

如果无限源支持重播过去的事件,系统可能会在第二次获得更好的水印,因此第一次标记为延迟的事情不太可能仍然被标记为延迟。

我不太确定您想要保证什么,但您可以让管道读取输入,然后写入数据副本,其中包括事件时间、处理时间以及元素是否被视为延迟。例如,TriggerExample将大量此类信息写入 BigQuery 以演示其工作原理。然后,如果您需要精确地重新处理它,您可以运行一个批处理管道,从副本中读取并进行回填。(这就是统一批处理+流式编程模型的好处!)