【问题标题】:Timestamp Skew in Google DataflowGoogle Dataflow 中的时间戳偏差
【发布时间】:2016-01-26 02:48:16
【问题描述】:

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

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

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

【问题讨论】:

    标签: google-cloud-dataflow


    【解决方案1】:

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

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

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

    【讨论】:

    • 不使用 PubSubIO 时有什么建议吗?
    • 时间戳信息取决于来源——如果您正在编写自己的无限来源,您可以随时指定水印的内容。
    猜你喜欢
    • 2012-06-03
    • 2023-02-22
    • 1970-01-01
    • 2015-06-27
    • 2015-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-24
    相关资源
    最近更新 更多