Google cloud dataflow 水印行为不稳定,可能是由于错误的事件时间(客户端时钟偏移)

Google cloud dataflow 水印行为不稳定,可能是由于错误的事件时间(客户端时钟偏移),google-cloud-dataflow,apache-beam,Google Cloud Dataflow,Apache Beam,我们有一个事件流,大约1k-3k/s,主要是心跳,来自视频流客户端,我们将其聚合到会话中。我们使用的会话窗口具有10分钟的间隔时间和默认触发(即不允许提前触发和延迟) 我们观察到的是(1)不稳定和突发的会话发射,(2)不稳定和“跳跃”的水印,有时可以追溯到历史上的2周 我们认为,这可能与具有本地时钟偏移的客户端子集有关,从而影响事件时间 这意味着水印不会将来自“坏”客户端的事件标记为延迟,而是根据这些新(旧)时间戳进行自我调整,从而有效地阻止最近结束的会话的发送。只有在预定义的时间内未观察到任何

我们有一个事件流,大约1k-3k/s,主要是心跳,来自视频流客户端,我们将其聚合到会话中。我们使用的会话窗口具有10分钟的间隔时间和默认触发(即不允许提前触发和延迟)

我们观察到的是(1)不稳定和突发的会话发射,(2)不稳定和“跳跃”的水印,有时可以追溯到历史上的2周

我们认为,这可能与具有本地时钟偏移的客户端子集有关,从而影响事件时间

这意味着水印不会将来自“坏”客户端的事件标记为延迟,而是根据这些新(旧)时间戳进行自我调整,从而有效地阻止最近结束的会话的发送。只有在预定义的时间内未观察到任何不良事件时,水印才会被提前到实时状态,并且可以发出最近的会话

这是一个合理的假设吗? 在上述条件下,这是预期行为吗?
假设我们的假设是正确的,建议的解决方案是什么?

你的假设听起来确实合理。发布/订阅水印跟踪将忽略过去远处偶尔出现的数据,但如果这种情况足够普遍,它将按照您所描述的那样运行。一种可能的解决方案是使用在云发布/订阅中接收记录的时间戳,而不是基于本地倾斜时钟的时间戳。您可以通过省略读取转换中的.timestampLabel()调用来实现这一点。

进一步调查后,我们发现只有不到0.4%的事件到达时,事件时间比到达时间晚10分钟以上。也许是这种模式(整个会话被扭曲)欺骗了水印启发式。有没有办法控制水印的计算方式(敏感度)?此外,忽略事件时间而选择到达时间,将意味着放弃波束模型的一个主要特征,因为无序到达将在未被注意的情况下通过,并引入正确性错误。目前没有控制水印估计的方法。我不太建议改为到达时间;您可以使用pubsub发布时间。这意味着,如果您的管道运行缓慢或中断,您仍然可以获得相同的保证。