Google cloud dataflow 如何通过pub/sub将旧数据重放到数据流中并维护正确的事件时间逻辑?

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设置为存档数据中的实际事件时间戳,并在发

我们尝试使用dataflow的处理时间独立性来启动新的流媒体作业,并通过发布/订阅将所有数据重播到其中,但遇到以下问题:

管道的第一阶段是事务id上的groupby,会话窗口为10秒,丢弃已触发的窗格,不允许延迟。因此,如果我们没有指定replay pub/sub主题的时间戳标签,那么当我们将所有事件时间戳重播到pub/sub中时,所有事件时间戳都是相同的,groupby会一直尝试将所有存档数据分组到事务id中。不好

如果我们将timestampLabel设置为存档数据中的实际事件时间戳,并在发布/订阅主题中一次回放1d,则它适用于第一天的事件,但一旦这些事件耗尽,回放发布/订阅的数据水印就会以某种方式跳到当前时间,所有后续重播的天数都将作为延迟数据删除。我真的不明白为什么会发生这种情况,因为这似乎违背了数据流逻辑独立于处理时间的观点

如果我们将时间戳标签设置为存档数据中的实际事件时间戳,并将其全部重放到发布/子主题中,然后启动流式处理作业来使用它,那么数据水印似乎永远不会前进,而且groupby中似乎没有任何内容。我也不太明白这是怎么回事。

你的方法#2和#3遇到了不同的问题:

方法#3(写入所有数据,然后开始消费):由于数据写入pubsub主题的顺序不正确,水印实际上无法前进,直到所有(或大部分)数据被消费-因为水印是一种软保证“您收到的其他项目不太可能比这晚事件时间”,但由于无序发布,发布时间和事件时间之间没有任何对应关系。因此,您的管道在处理完所有这些数据之前实际上一直处于停滞状态

方法#2:从技术上讲,它在每一天都会遇到相同的问题,但我认为一天内的数据量并没有那么大,因此管道能够处理它。但是,在这之后,pubsub通道将很长一段时间保持为空,在这种情况下,
PubsubIO
的当前实现将水印提前到实时,这就是为什么会宣布更多数据延迟的原因。对此有更多的解释

一般来说,快速处理大量积压工作(例如,通过使用历史数据“播种”管道,然后继续输入新数据)是我们目前不太支持的一个重要用例

同时,我有几个建议给你:

  • (更好)在方法#2上使用一种变体,但尝试根据流媒体管道对其进行计时,以便pubsub频道不会保持空
  • 使用方法#3,但每个工作人员有更多的工作人员和更多的磁盘(您当前的工作似乎是使用最多8个工作人员的自动缩放-尝试更大的方法,例如100?它会在赶上后缩小)

您能否澄清您使用什么将历史数据写入pubsub,有多少数据,以及您是按事件时间顺序还是按任意顺序写入?此外,对于您的方法,查看太慢的作业的作业ID也会有所帮助#2或#3。最初,我们有一个批处理作业,从bq表读取数据并将其写入发布/订阅。之后,这就不起作用了(我们假设,因为同一时间戳上的数据太多)我们将它改为运行一系列批处理作业,一次只回放一天,因为这是我们能找到的唯一一个以任何顺序读取bq的方法。所以它在一天内的顺序是任意的,但是天是有序的。我所关注的当前运行有大约100万个事件被归档,但一旦投入生产,将达到数十亿。方法2的作业id为2016-11-02_11_05_48-11273762957648435844仍在运行非常好的信息,谢谢。我不知道为什么我没有检查javadocs,但是我可以建议在该部分添加一个链接,或者在这里添加信息吗?我忘了提到方法#3仍在一次重播一天,所以应该大致订购。我猜这还不够。我想我有足够的时间去想一些至少在现在起作用的事情:当一个作业决定重置到水印的时间小于一个新作业开始编写下一个数据块所需的时间时,做“定时”的事情是非常困难的=/Hmm,这取决于数据量,您可以使用DirectRunner在本地计算机上运行“发布者”作业。虽然我想这并不能消除BigQuery导出延迟。当然不能,在prod中会有数百个Gig。另外,请澄清一下,如果我在方法#3中按顺序运行天来缓冲pub/sub中的所有行,为什么不起作用?行不是按照大致的顺序写出来的吗?我猜看到大量发布/订阅数据积压的工作会吸引更多的读者?嗯,我想我不明白2和3之间的区别,你能再澄清一下吗?