Google cloud dataflow 谷歌数据流管道卡在GroupByKey上

Google cloud dataflow 谷歌数据流管道卡在GroupByKey上,google-cloud-dataflow,apache-beam,Google Cloud Dataflow,Apache Beam,在GroupByKey中出现了许多类似的问题,但是在尝试了一整天PubSubIO和窗口触发器的不同设置之后,我仍然没有进一步的了解 我有一个生成稳定数据流的子主题: 在数据流中启动管道时,会添加一些元素。此后,元素的数量保持不变。数据水印增长缓慢,大约比当前时间晚10-11分钟,这与PubSub订阅的消息保留时间10分钟一致。我尝试了不同的设置来读取PubSub,有属性和没有属性,自己添加时间戳等等。在这个工作中,它只是一个普通的读取,没有属性,依靠谷歌来计算时间戳 在这里,我尝试运行我的管道,

在GroupByKey中出现了许多类似的问题,但是在尝试了一整天PubSubIO和窗口触发器的不同设置之后,我仍然没有进一步的了解

我有一个生成稳定数据流的子主题: 在数据流中启动管道时,会添加一些元素。此后,元素的数量保持不变。数据水印增长缓慢,大约比当前时间晚10-11分钟,这与PubSub订阅的消息保留时间10分钟一致。我尝试了不同的设置来读取PubSub,有属性和没有属性,自己添加时间戳等等。在这个工作中,它只是一个普通的读取,没有属性,依靠谷歌来计算时间戳

在这里,我尝试运行我的管道,它不按键进行任何分组: 我尝试了很多窗口设置。我的目标是每1分钟30分钟的滑动窗口,但这里我只是想让它在1分钟的固定窗口中工作。我还尝试了很多不同的触发方式,包括提前和延迟触发。在这个作业中,我没有指定任何内容,即它应该使用默认触发器

作业id为2019-11-01_06_38_28-26543038438761133

有人对我还可以通过GBK获取哪些元素有什么建议吗

更新:

我已经简化了我的管道,使用其中一条评论中的提示继续解决问题,以便在阅读PubSub消息时查看水印

我在PubSub消息上有一个用作时间戳的属性(
。withTimestampAttribute(…)
)。在
ProcessContext
中记录
timestamp()
会给出正确的时间戳和窗口分配。消息流实时传输,延迟几秒钟,但问题是“数据水印”会延迟一段时间(观察时间约为1.5小时),因此窗口永远不会触发,GroupByKey也不会工作

如果我在从PubSub读取时省略
。withTimestampAttribute(…)
,一切似乎都正常,但我的时间戳有一个延迟,这在许多情况下会导致消息被分配到后面的窗口

我通过在处理时间而不是事件时间触发找到了解决方法,但我还没有评估这是否是一个真正的解决方案:

.triggering(AfterProcessingTime.pastFirstElementInPane().alignedTo(Duration.standardMinutes(1)).plusDelayOf(Duration.standardMinutes(1)))
.withAllowedLateness(Duration.ZERO)    
.discardingFiredPanes()

问题是,我如何确保在使用timestamp属性从PubSub读取时水印被更新?

是否有大量已删除的事件可以通过UI判断?我无法访问您的工作日志。我看到的一个常见原因是水印是在事件发布时建立的,但用户代码再次设置了事件时间戳,这使得所有这些事件都被视为延迟事件并被丢弃在GBK。我已使用您评论中的提示更新了问题。听起来问题发生在
。withTimestampAttribute()
,正如你所提到的,如果你不使用它,它似乎是有效的。在这种情况下,您的timestamp属性是否遵循此处定义的要求:是的,它在RFC 3339中,并且被正确解析,至少ProcessContext上的.timestamp()方法给出了正确的时间。问题似乎是水印未前进。您是否能够解决此问题?是否有大量已删除的事件可以通过UI判断?我无法访问您的工作日志。我看到的一个常见原因是水印是在事件发布时建立的,但用户代码再次设置了事件时间戳,这使得所有这些事件都被视为延迟事件并被丢弃在GBK。我已使用您评论中的提示更新了问题。听起来问题发生在
。withTimestampAttribute()
,正如你所提到的,如果你不使用它,它似乎是有效的。在这种情况下,您的timestamp属性是否遵循此处定义的要求:是的,它在RFC 3339中,并且被正确解析,至少ProcessContext上的.timestamp()方法给出了正确的时间。问题似乎是水印没有前进。你能解决这个问题吗?