我一直在阅读有关Google DataFlow的一些信息。我有兴趣将它用于我收到的两个流之间的连接操作。两个流都包含一个共享ID,可用作连接键。
然而,在某些情况下,流B中的事件可能会在系统中接收,然后是流A中的事件。在这种情况下,在给定水印之后,假设我设置了类似.withAllowedLateness(3 days)
的内容,DataFlow将如何处理这个?
它会重新加载旧事件以匹配它们吗?它不能加入这些吗?它是否会在内存中保留3天的数据,以防某些后期事件发生? (如果重新开始操作,它是否会错过连接,因为例如我改变了窗口大小?)
答案 0 :(得分:1)
事件将使用Dataflow的状态机制(不一定在内存中)持续缓冲,直到允许的延迟,然后进行垃圾收集。
在幕后,项目将按(key, window)
元组进行分组,因此如果您更改窗口和update the pipeline,我相信可能会错过某些加入结果,因为来自流{的较旧的缓冲项由于A
的不同,{1}}将使用相同的密钥与流(key, window)
中的新项目具有不同的B
元组。
您可以使用TestStream在Beam direct runner的单元测试中对此进行试验。