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