Google cloud dataflow 如何通过pub/sub将旧数据重放到数据流中并维护正确的事件时间逻辑?
我们尝试使用dataflow的处理时间独立性来启动新的流媒体作业,并通过发布/订阅将所有数据重播到其中,但遇到以下问题: 管道的第一阶段是事务id上的groupby,会话窗口为10秒,丢弃已触发的窗格,不允许延迟。因此,如果我们没有指定replay pub/sub主题的时间戳标签,那么当我们将所有事件时间戳重播到pub/sub中时,所有事件时间戳都是相同的,groupby会一直尝试将所有存档数据分组到事务id中。不好 如果我们将timestampLabel设置为存档数据中的实际事件时间戳,并在发布/订阅主题中一次回放1d,则它适用于第一天的事件,但一旦这些事件耗尽,回放发布/订阅的数据水印就会以某种方式跳到当前时间,所有后续重播的天数都将作为延迟数据删除。我真的不明白为什么会发生这种情况,因为这似乎违背了数据流逻辑独立于处理时间的观点 如果我们将时间戳标签设置为存档数据中的实际事件时间戳,并将其全部重放到发布/子主题中,然后启动流式处理作业来使用它,那么数据水印似乎永远不会前进,而且groupby中似乎没有任何内容。我也不太明白这是怎么回事。你的方法#2和#3遇到了不同的问题: 方法#3(写入所有数据,然后开始消费):由于数据写入pubsub主题的顺序不正确,水印实际上无法前进,直到所有(或大部分)数据被消费-因为水印是一种软保证“您收到的其他项目不太可能比这晚事件时间”,但由于无序发布,发布时间和事件时间之间没有任何对应关系。因此,您的管道在处理完所有这些数据之前实际上一直处于停滞状态 方法#2:从技术上讲,它在每一天都会遇到相同的问题,但我认为一天内的数据量并没有那么大,因此管道能够处理它。但是,在这之后,pubsub通道将很长一段时间保持为空,在这种情况下,Google cloud dataflow 如何通过pub/sub将旧数据重放到数据流中并维护正确的事件时间逻辑?,google-cloud-dataflow,apache-beam,Google Cloud Dataflow,Apache Beam,我们尝试使用dataflow的处理时间独立性来启动新的流媒体作业,并通过发布/订阅将所有数据重播到其中,但遇到以下问题: 管道的第一阶段是事务id上的groupby,会话窗口为10秒,丢弃已触发的窗格,不允许延迟。因此,如果我们没有指定replay pub/sub主题的时间戳标签,那么当我们将所有事件时间戳重播到pub/sub中时,所有事件时间戳都是相同的,groupby会一直尝试将所有存档数据分组到事务id中。不好 如果我们将timestampLabel设置为存档数据中的实际事件时间戳,并在发
PubsubIO
的当前实现将水印提前到实时,这就是为什么会宣布更多数据延迟的原因。对此有更多的解释
一般来说,快速处理大量积压工作(例如,通过使用历史数据“播种”管道,然后继续输入新数据)是我们目前不太支持的一个重要用例
同时,我有几个建议给你:
- (更好)在方法#2上使用一种变体,但尝试根据流媒体管道对其进行计时,以便pubsub频道不会保持空
- 使用方法#3,但每个工作人员有更多的工作人员和更多的磁盘(您当前的工作似乎是使用最多8个工作人员的自动缩放-尝试更大的方法,例如100?它会在赶上后缩小)