Google cloud dataflow 不前进

Google cloud dataflow 不前进,google-cloud-dataflow,google-cloud-pubsub,spotify-scio,Google Cloud Dataflow,Google Cloud Pubsub,Spotify Scio,我使用Scio编写了一个ApacheBeam作业,目的是为传入的数据记录生成会话ID,然后以某种方式对它们进行充实,然后再将它们输出到BigQuery。代码如下: val measurements=sc.customInput(“ReadFromPubsub”, PubsubIO .ReadMessagesWithatAttributes() .withTimestampAttribute(“ts”) .fromSubscription(订阅) ) 测量 .map(提取测量).flatMap{

我使用Scio编写了一个ApacheBeam作业,目的是为传入的数据记录生成会话ID,然后以某种方式对它们进行充实,然后再将它们输出到BigQuery。代码如下:

val measurements=sc.customInput(“ReadFromPubsub”,
PubsubIO
.ReadMessagesWithatAttributes()
.withTimestampAttribute(“ts”)
.fromSubscription(订阅)
)
测量
.map(提取测量).flatMap{
案例成功(事件)=>
一些(事件)
案例失败(ex)=>
没有一个
}
.timestampBy(u.timestamp)
.带会话窗口(会话AP、窗口选项(
触发器=重复.forever(AfterWatermark.pastEndOfWindow()),
累加模式=累加模式。丢弃已触发的窗格,
允许延迟=持续时间。标准天数(1),
timestampCombiner=timestampCombiner.END\u窗口的\u
))
.keyBy(u.clientID)
.groupByKey
.托维德
.map(assignSessionID)
.toSCollection.flatMap(u.results)
.地图(丰富)
.saveAsTypedBigQuery(输出,bigquery.WRITE\u追加,bigquery.CREATE\u从不)
我使用事件时间戳,它是
PubsubMessage
中属性键
ts
的值,作为我的时间戳属性。这与我在打开数据窗口之前在
.timestampBy
中使用的时间戳完全相同。我期望的是,一旦水印通过sessionGap(默认为30分钟),输出触发器就会触发

使用Dataflow runner和DirectRunner,触发器永远不会触发,即使我模拟的数据的时间戳间隔超过30分钟。在Dataflow UI中,我可以看到水印从不根据事件时间戳前进,而是每隔一分钟前进一次,就好像没有收到任何数据一样

我已经验证了在执行窗口之前的转换时,数据是否已被实际接收。我也测试过,但可能这还不足以更新水印?我还设置了一个JobTest,在该测试中,我获得了预期的输出,并向我发出信号,表明问题是基于时间戳/水印的


我确信我在文档中遗漏了一些重要的东西,或者在某个地方犯了一个愚蠢的错误,希望有人能给我指出正确的方向

您可以尝试添加到AfterWatermark.pastEndofWindows,查看水印是否得到更新,并检查是否有延迟到达的数据。您还可以找到有关触发器的文档。

将消息发布到pubsub时,如何生成写入消息“ts”属性的时间戳,以及如何对其进行编码

如果我没记错的话,时间戳必须编码为RFC3339规范,例如“2020-10-02T10:00:00-05:00”

您可以尝试的另一件事是临时删除“.withTimestampAttribute(“ts”)行,以便自动生成所使用的时间戳。然后验证水印是否前进。如果是这种情况,这表明时间戳值(例如,值可能不是您期望的值)或其编码存在问题

最后,如果使用云数据流运行器,请查看作业状态页面。这将显示数据水印的当前值。您可以检查它,看看它是否符合您的期望