我面临一个奇怪的问题,我在一个使用Apache Beam的流式BigQuery表上实现了一个小型增量工作。
我正在将数据流式传输到BigQuery表,每小时我都会运行一个作业,将该流表中的所有新记录复制到一个已协调的表中。 delta建立在我在流表上引入的CreateDatetime列之上。将记录加载到流表后,它将获取当前的UTC时间戳。因此,delta自然会将所有具有比上次更新的CreateDatetime的记录直到批处理运行的当前时间。
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 Datflow日志时,我可以看到当时没有为查询返回的记录,但是当我现在运行相同的查询时,我得到了记录。流式记录是否有任何方式可以在查询中超级到达,或者Apache Beam是否可以处理记录但是不能长时间写入记录?我没有应用任何窗口策略。
有什么想法吗?
答案 0 :(得分:1)
执行流式插入时,这些行可用于批量导出的速度会有所延迟,如文档data availability中所述。
因此,在时间T2,您可能已将一堆行流式传输到BigQuery中,这些行存储在流式缓冲区中。然后,您可以从时间T1到T2运行批处理作业,但只能查看到T2缓冲区的行。因此,将删除每个增量运行的缓冲区中的所有行。
您可能需要选择NowUTC来识别流缓冲区,以便 next 运行处理缓冲区内的行。