Google cloud dataflow 在使用DataflowRunner和Dataflow服务运行时,PubsubIO不会将自定义时间戳属性输出为context.timestamp

Google cloud dataflow 在使用DataflowRunner和Dataflow服务运行时,PubsubIO不会将自定义时间戳属性输出为context.timestamp,google-cloud-dataflow,apache-beam,google-cloud-pubsub,Google Cloud Dataflow,Apache Beam,Google Cloud Pubsub,我正在处理一个ApacheBeam项目,该项目遇到了与自定义时间戳属性相关的Dataflow服务和PubsubIO问题。Beam SDK的当前版本为2.7.0 在该项目中,我们有两个数据流作业,通过PubSub主题和订阅进行通信: 第一条管道(将数据下沉至PubSub) 此管道基于每个消息工作,因此除了GlobalWindows(默认为Beam)之外,它没有应用自定义窗口策略。在这条管道的末尾,我们使用PubsubIO.writeMessages()将所有已经分配了属性映射的消息(包括它们的事件

我正在处理一个ApacheBeam项目,该项目遇到了与自定义时间戳属性相关的Dataflow服务和PubsubIO问题。Beam SDK的当前版本为2.7.0

在该项目中,我们有两个数据流作业,通过PubSub主题和订阅进行通信:

第一条管道(将数据下沉至PubSub)

此管道基于每个消息工作,因此除了
GlobalWindows
(默认为Beam)之外,它没有应用自定义窗口策略。在这条管道的末尾,我们使用
PubsubIO.writeMessages()
将所有已经分配了属性映射的消息(包括它们的事件时间戳(例如“published_At”)放入(写入)
一个PubSub主题

注意:如果我们使用
PubsubIO.writeMessages().withTimestampAttribute()
,此方法将告诉
PubsubIO.ShardFn
PubsubIO.WriteFn
PubsubClient
写入/覆盖映射中的下沉管道的处理时间

第二条管道(从PubSub读取数据)

在第二个管道(阅读管道)中,我们尝试了源代码的
PubsubIO.readMessagesWithAttributes().withTimestampAttribute(“published_at”)
PubsubIO.readStrings().withTimestampAttribute(“published_at”)

  • 使用DirectRunner运行时,一切正常。信息 从PubSub订阅中读取并输出到 带有
    ProcessContext.timestamp()
    的下游阶段等于其 事件时间戳
    “发布于”
  • 但是当使用DataflowRunner运行时,
    ProcessContext.timestamp()
    始终设置为接近实时,接近下沉 管道的处理时间。我们检查并确认 时间戳并非来自PubSub的发布时间。所有数据都是正确的 然后将分配到与其事件域相比错误的窗口 时间戳。我们希望延迟的数据被删除,而不是被分配 进入无效窗口
注意:在打开第二条管道以获得某种历史/后期数据之前,我们已经让Pubsub主题填充了大量数据

假定的根本原因

深入查看DataflowRunner的源代码,我们可以看到,Dataflow服务使用完全不同的Pubsub代码(在管道构建时覆盖PubsubIO.Read)从Pubsub读取和接收到Pubsub

因此,如果我们想使用Beam SDK的PubsubIO,我们必须使用实验选项
“enable_custom_pubsub_source”
。但到目前为止还没有运气,因为我们遇到了这个问题,无法测试Beam SDK的Pubsub代码

解决方案

我们当前的解决办法是,在将窗口分配给消息的步骤之后,我们实现了一个
DoFn
,以对照其
间隔窗口检查事件时间戳如果窗口无效,我们只需删除消息,然后运行每周或半周的作业,从历史来源更正消息。最好有一些缺失的数据,而不是计算不正确的数据

请与我们分享这个案例的经验。我们知道,从数据流水印管理的角度来看,如果摄取的数据是稀疏的(不够密集),则可以说水印将自身调整为当前实时

我们还认为,我们对数据流服务维护PubsubUnboundedSource的输出时间戳的方式存在误解,因为我们对ApacheBeam和Google的数据流还不熟悉,所以有些事情我们还不知道


非常感谢

我找到了解决此问题的方法。在我的下沉管道中,与RFC 3339标准相比,时间戳属性设置为错误的日期格式。格式化日期缺少“Z”字符。我们要么修复了“Z”字符,要么改为使用自历元以来的毫秒数。两者都很好

但有一件事是,当数据流服务无法解析错误的日期格式时,它会发出警告或抛出错误,但会占用所有元素的处理时间,因此,它们被分配到错误的事件时间窗口