数据流覆盖处理时间

时间:2016-02-16 22:09:21

标签: google-cloud-dataflow

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

我试图推断故障情况,以及如何重新计算管道输出。

假设我有一个简单计算收到事件的管道,固定窗口为1h,允许延迟2h。说我对窗口[t0,t0 + 1h]感兴趣,并说我有:

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

然后计算事件A,并丢弃事件B.

现在,说几天之后我发现代码中的一个错误,我想重新运行管道来重新计算同一个过去窗口中的事件[t0,t0 + 1h]。 如果处理时间现在= t0 +几天,那么所有事件都将被丢弃。

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

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

1 个答案:

答案 0 :(得分:4)

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

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

如果无限制的来源支持重播过去的事件,系统可能会第二次获得更好的水印,所以第一次延迟标记的内容不太可能会被标记为迟。

我不太确定你要保证什么,但是你可以让你的管道读取输入然后写一个数据的副本,包括事件时间,处理时间,以及元素是否是考虑得很晚。例如,TriggerExample将大量此类信息写入BigQuery以演示其工作原理。然后,如果您需要完全重新处理它,您可以运行从该副本读取并执行回填的批处理管道。 (这是统一批量+流编程模型的好处!)