Google cloud dataflow 在使用DataflowRunner和Dataflow服务运行时,PubsubIO不会将自定义时间戳属性输出为context.timestamp
我正在处理一个ApacheBeam项目,该项目遇到了与自定义时间戳属性相关的Dataflow服务和PubsubIO问题。Beam SDK的当前版本为2.7.0 在该项目中,我们有两个数据流作业,通过PubSub主题和订阅进行通信: 第一条管道(将数据下沉至PubSub) 此管道基于每个消息工作,因此除了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()将所有已经分配了属性映射的消息(包括它们的事件
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运行时,
始终设置为接近实时,接近下沉 管道的处理时间。我们检查并确认 时间戳并非来自PubSub的发布时间。所有数据都是正确的 然后将分配到与其事件域相比错误的窗口 时间戳。我们希望延迟的数据被删除,而不是被分配 进入无效窗口ProcessContext.timestamp()
“enable_custom_pubsub_source”
。但到目前为止还没有运气,因为我们遇到了这个问题,无法测试Beam SDK的Pubsub代码
解决方案
我们当前的解决办法是,在将窗口分配给消息的步骤之后,我们实现了一个DoFn
,以对照其间隔窗口检查事件时间戳如果窗口无效,我们只需删除消息
,然后运行每周或半周的作业,从历史来源更正消息。最好有一些缺失的数据,而不是计算不正确的数据
请与我们分享这个案例的经验。我们知道,从数据流水印管理的角度来看,如果摄取的数据是稀疏的(不够密集),则可以说水印将自身调整为当前实时
我们还认为,我们对数据流服务维护PubsubUnboundedSource的输出时间戳的方式存在误解,因为我们对ApacheBeam和Google的数据流还不熟悉,所以有些事情我们还不知道
非常感谢 我找到了解决此问题的方法。在我的下沉管道中,与RFC 3339标准相比,时间戳属性设置为错误的日期格式。格式化日期缺少“Z”字符。我们要么修复了“Z”字符,要么改为使用自历元以来的毫秒数。两者都很好 但有一件事是,当数据流服务无法解析错误的日期格式时,它会发出警告或抛出错误,但会占用所有元素的处理时间,因此,它们被分配到错误的事件时间窗口