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