Google数据流中的时间戳偏差

时间:2016-01-26 02:48:16

标签: google-cloud-dataflow

我正在尝试运行一个从pubsub主题读取并写入bigquery的管道。时间戳是从主题消息中解析的。但是,我收到了关于允许的时间戳偏差的错误,并参考了下面的文档。

  

getAllowedTimestampSkew public Duration getAllowedTimestampSkew()   返回允许的时间戳偏差持续时间,这是最大值   时间戳可以向后移动的持续时间   DoFn.Context.outputWithTimestamp(OutputT,org.joda.time.Instant)。该   默认值为Duration.ZERO,在这种情况下,时间戳只能是   转向未来。对于无限歪斜,返回   Duration.millis(Long.MAX_VALUE)。

我想知道的是为什么默认的允许偏差为零? Dataflow不是处理延迟和无序数据的重点吗?什么时候数据会转移到未来?

1 个答案:

答案 0 :(得分:4)

Dataflow使用水印处理延迟和无序数据,以跟踪输入完成的事件时间点。使用挂起的PubSub消息上的时间戳知识来跟踪PubSub的水印。这依赖于知道每个PubSub消息与每个元素在流经管道时相关联的时间戳。输出具有时间戳偏差的事件违反了这一知识,并且可能导致不正确的行为,包括需要使用新的时间戳重新分配窗口,以使管道的其余部分正常运行和/或由于“太晚”而丢弃元素。

博文Streaming 101Streaming 102更详细地讨论了水印的概念和处理事件时间。

在这种情况下,由于您使用的是PubSubIO,因此您可以利用它是内置源并具有特殊逻辑来跟踪PubSub队列中消息事件时间的水印。在每个已发布的消息上添加时间戳标签,然后使用 PubSubIO#timestampLabel与消息的事件时间相关联。