数据流覆盖处理时间
Dataflow override processing time
有没有办法覆盖数据流中的处理时间(不是事件时间)?
我正在尝试推理失败场景,以及如何重新计算管道的输出。
假设我有一个管道,它简单地计算接收到的事件,固定 window 为 1 小时,允许延迟 2 小时。假设我对 window [t0, t0+1h) 感兴趣,并说我有:
- 事件A,事件时间=t0+10m,处理时间=t0+30m
- 事件B,事件时间=t0+10m,处理时间=t0+90m
然后统计A事件,丢弃B事件
现在,假设几天后我在代码中发现了一个错误,我想重新运行 管道以重新计算同一过去的事件 window [t0, t0 +1 小时)。
如果处理时间现在=t0+几天,那么所有的事件都会被丢弃。
如果我忽略允许的迟到(假设无限),那么事件 A 和 B 都会被计算在内。
通过覆盖处理时间(假设我是第一次存储它),我可以确保事件 A 被计算在内而事件 B 不被计算在内。有没有办法做到这一点?谢谢!
处理时间是元素到达系统进行处理的时间。水印跟踪我们在输入流中相对于元素事件时间的位置。
水印通常只是一种启发式方法,因此当它出错并且元素比预期更早时,这些元素将被标记为延迟。水印有可能落后于处理时间,因此元素可能会在延迟后到达,但仍不会被标记为延迟。例如,如果用户正在玩手机游戏,水印可能会针对导致多个延迟事件的大规模网络减速进行调整。在这种情况下,实际上没有元素可以被认为是迟到的。但是水印不会针对偶尔在离线模式下玩游戏的用户进行调整,因此这可能会导致数据延迟。有关水印和数据流模型的有用背景,请参阅这些文章:Streaming 101 and Streaming 102。
如果无限源支持重播过去的事件,系统可能会在第二次获得更好的水印,因此第一次被标记为迟到的东西不太可能仍然被标记为迟到。
我不太确定你要保证什么,但你可以让你的管道读取输入,然后写一份数据副本,包括事件时间、处理时间,以及是否元素被认为是迟到的。例如,TriggerExample 将大量此类信息写入 BigQuery 以演示其工作原理。然后,如果您需要准确地重新处理它,您可以 运行 从副本中读取并进行回填的批处理管道。 (这就是统一批处理+流式编程模型的好处!)
有没有办法覆盖数据流中的处理时间(不是事件时间)?
我正在尝试推理失败场景,以及如何重新计算管道的输出。
假设我有一个管道,它简单地计算接收到的事件,固定 window 为 1 小时,允许延迟 2 小时。假设我对 window [t0, t0+1h) 感兴趣,并说我有:
- 事件A,事件时间=t0+10m,处理时间=t0+30m
- 事件B,事件时间=t0+10m,处理时间=t0+90m
然后统计A事件,丢弃B事件
现在,假设几天后我在代码中发现了一个错误,我想重新运行 管道以重新计算同一过去的事件 window [t0, t0 +1 小时)。 如果处理时间现在=t0+几天,那么所有的事件都会被丢弃。
如果我忽略允许的迟到(假设无限),那么事件 A 和 B 都会被计算在内。
通过覆盖处理时间(假设我是第一次存储它),我可以确保事件 A 被计算在内而事件 B 不被计算在内。有没有办法做到这一点?谢谢!
处理时间是元素到达系统进行处理的时间。水印跟踪我们在输入流中相对于元素事件时间的位置。
水印通常只是一种启发式方法,因此当它出错并且元素比预期更早时,这些元素将被标记为延迟。水印有可能落后于处理时间,因此元素可能会在延迟后到达,但仍不会被标记为延迟。例如,如果用户正在玩手机游戏,水印可能会针对导致多个延迟事件的大规模网络减速进行调整。在这种情况下,实际上没有元素可以被认为是迟到的。但是水印不会针对偶尔在离线模式下玩游戏的用户进行调整,因此这可能会导致数据延迟。有关水印和数据流模型的有用背景,请参阅这些文章:Streaming 101 and Streaming 102。
如果无限源支持重播过去的事件,系统可能会在第二次获得更好的水印,因此第一次被标记为迟到的东西不太可能仍然被标记为迟到。
我不太确定你要保证什么,但你可以让你的管道读取输入,然后写一份数据副本,包括事件时间、处理时间,以及是否元素被认为是迟到的。例如,TriggerExample 将大量此类信息写入 BigQuery 以演示其工作原理。然后,如果您需要准确地重新处理它,您可以 运行 从副本中读取并进行回填的批处理管道。 (这就是统一批处理+流式编程模型的好处!)