我遇到了一个奇怪的问题,我在使用Apache Beam的流式BigQuery表之上实现了一个小增量作业。
我正在将数据流式传输到BigQuery表,每小时我都会运行一个作业,将该流式传输表中的任何新记录复制到协调表中。增量建立在我在流式传输表中引入的CreateDatetime列之上。一旦记录被加载到流式传输表中,它就会获得当前的UTC时间戳。因此,增量自然会将所有具有比上次更新的CreateDatetime的记录带到Batch运行的当前时间。
CreatedDatetime >= LastDeltaDate AND
CreatedDatetime < NowUTC
LastDeltaDate的逻辑如下:
1. Start: LastDeltaDate = 2017-01-01 00:00:00
2. 1st Delta Run:
- NowUTC = 2017-10-01 06:00:00
- LastDeltaDate = 2017-01-01 00:00:00
- at the end of the successful run LastDeltaDate = NowUTC
3. 2nd Delta Run:
- NowUTC = 2017-10-01 07:00:00
- LastDeltaDate = 2017-10-01 06:00:00
- at the end of the successful run LastDeltaDate = NowUTC
...
现在,每隔一天,我就会发现流表上的记录,但从未到达我的对账表。当我检查时间戳时,我看到它们远离批处理运行,当我检查Google数据流日志时,我可以看到当时没有为查询返回任何记录,但当我现在运行相同的查询时,我得到了记录。有没有可能流式传输的记录会在查询中到达超级晚,或者有没有可能Apache Beam正在处理一条记录,但长时间没有写入它?我没有应用任何窗口策略。
有什么想法吗?
执行流式插入时,这些行可用于批处理导出的速度存在延迟,如其留档数据可用性中所述。
因此,在时间T2,您可能已经将一堆行流式传输到存储在流式缓冲区中的BigQuery中。然后,您从时间T1到T2运行批处理作业,但只看到T2-buffer之前的行。因此,每次增量运行时缓冲区中的任何行都将被删除。
您可能需要让您选择的NorthUTC了解流缓冲区,以便下一次运行缓冲区内的行。