水印卡住了

ivqmmu1c  于 2021-06-21  发布在  Flink
关注(0)|答案(2)|浏览(423)

我通过pub/sub将数据摄取到一个以无限模式运行的数据流管道。数据基本上与跟踪设备捕获的时间戳相协调。这些消息分批到达,其中每个批可能是1..n条消息。在一段时间内,可能没有消息到达,稍后可能会重新发送(或不发送)。我们使用每个坐标的时间戳(utc)作为发布子消息的属性。并通过时间戳标签读取管道:

pipeline.apply(PubsubIO.Read.topic("new").timestampLabel("timestamp")

坐标和延迟的示例如下所示:

36 points wait 0:02:24
36 points wait 0:02:55
18 points wait 0:00:45
05 points wait 0:00:01
36 points wait 0:00:33
36 points wait 0:00:43
36 points wait 0:00:34

消息可能如下所示: 2013-07-07 09:34:11;47.798766;13.050133 在第一批之后,水印是空的,在第二批之后,我可以在管道诊断中看到水印,只是它没有得到更新,尽管新消息到达。同样根据stackdriver日志,pubsub没有未送达或未确认的消息。
水印不应该随着新事件时间的消息到达而向前移动吗?
根据gcd上运行的pubsubio的水印启发式是什么?水印也应该每2分钟向前移动一次,而不是吗?
[…]如果我们在超过两分钟的时间内没有看到订阅上的数据(并且没有积压工作),我们将水印提前到接近实时的状态。[…]
更新以解决bens的问题:
我们可以看一下工作证吗?
是的,我刚刚在欧洲中部时间09:52(utc时间07:52)重新启动了整个设置,作业id为2017-05-05\u 00\u 49\u 11-11176509843641901704。
您使用的sdk版本是什么?
1.9.0
如何发布带有时间戳标签的消息?
我们使用一个python脚本来发布使用pub-sub-sdk的数据。来自那里的消息可能看起来像:
{'data':{时间戳;拉丁美洲;长;ele},'时间戳':'2017-05-05t07:45:51z'}
我们在数据流中使用timestamp属性作为timestamp标签。
水印卡在什么地方?
对于这项工作,水印现在停留在09:57:35(我张贴这大约10:10),虽然新的数据发送,例如在

10:05:14
10:05:43
10:06:30

我还可以看到,我们可能会以超过10秒的延迟向pub sub发布数据,例如,在10:07:47,我们发布的数据的最大时间戳为10:07:26。
几个小时后,水印恢复了,但我不明白为什么它一开始就延迟/不移动。

nkcskrwz

nkcskrwz1#

这是pubsub水印跟踪逻辑中的一个边缘情况,它有两个解决方法(见下文)。基本上,如果2分钟内没有输入,则水印将前进到当前时间。但是,如果数据的到达速度超过每2分钟一次,但qps仍然非常低,那么就没有足够的数据使估计的水印保持最新。
正如我提到的,有几个解决方法:
如果处理更多的数据,问题自然会得到解决。
或者,如果您注入额外的消息(例如每秒2条),它将提供足够的数据,以便水印更快地前进。这些只需要有时间戳,就可以立即从管道中过滤出来。

41zrol4v

41zrol4v2#

作为记录,关于前面提到的直接运行程序上下文中的边缘情况,需要记住的另一件事是运行程序的并行性。拥有更高的并行性(尤其是在多核机器上)似乎需要更多的数据。在我的情况下是一个设置 --targetParallelism=1 帮助。基本上在没有任何其他干预的情况下,将卡住的管道转变为工作管道。

相关问题