Google cloud dataflow 具有固定窗口和基于事件时间的触发器的Beam CoGroupByKey生成随机元素

Google cloud dataflow 具有固定窗口和基于事件时间的触发器的Beam CoGroupByKey生成随机元素,google-cloud-dataflow,apache-beam,Google Cloud Dataflow,Apache Beam,我在Beam中有一个管道,它使用CoGroupByKey组合2个PCollection,第一个从发布/订阅中读取,第二个使用相同的PCollection,但通过使用JdbcIO.readAll从表中查找附加信息来丰富数据。因此,如果第二个PCollection中的数据不存在于第一个PCollection中,则第二个PCollection中不可能存在数据 有一个10秒的固定窗口,有一个基于事件的触发器,如下所示 Repeatedly.forever( AfterWatermark.past

我在Beam中有一个管道,它使用
CoGroupByKey
组合2个PCollection,第一个从发布/订阅中读取,第二个使用相同的PCollection,但通过使用
JdbcIO.readAll
从表中查找附加信息来丰富数据。因此,如果第二个PCollection中的数据不存在于第一个PCollection中,则第二个PCollection中不可能存在数据

有一个10秒的固定窗口,有一个基于事件的触发器,如下所示

Repeatedly.forever(
    AfterWatermark.pastEndOfWindow().withEarlyFirings(
        AfterProcessingTime.pastFirstElementInPane().plusDelayOf(Duration.standardSeconds(40))
    ).withLateFirings(AfterPane.elementCountAtLeast(1))
);
我看到的问题是,当我使用
Drain
模式停止管道时,它似乎在为第二个PCollection随机生成元素,而此时没有任何消息进入输入发布/子主题。当管道也在运行时,这种情况也会随机发生,但并不一致,但在排空管道时,我能够始终如一地重现这种情况

请在下面找到输入与输出之间的差异


您使用的是非确定性触发,这意味着输出对事件发生的确切顺序非常敏感。另一种看待这一点的方式是CoGBK不会等待双方都加入;任何一方一进来,扳机就开始滴答作响

例如,让我们分别调用pcollection A和A',并假设它们都有两个元素a1、a2、a1'和a2'(共同来源)

假设a1和a1'进入CoGBK,经过39秒,然后a2进入(在同一个键上),再经过2秒,然后a2'进入。当40秒标记到达时,CoGBK将输出([a1,a2],[a1']),然后当窗口关闭时([],将发出[a2'])。(即使所有数据都在同一个密钥上,如果在较长的路径上有超过40秒的时间延迟,这种情况也会偶尔发生,并且几乎肯定会发生在任何延迟数据上(每一方将单独触发)


排水会让事情变得更糟,例如,我认为所有处理时间都会立即触发火灾。

当管道排水时,它仍会处理飞行中的数据。是“随机元素”吗不是飞行中的数据?嗨@PeterKim,不,它们不是飞行中的数据,我用
CoGroupByKey
步骤中输入与输出的屏幕截图更新了这个问题,来自两个集合的输入大小相同,但输出更大。你能检查水印和pane.info,看看是否有一些元素由于触发延迟而触发吗ger定义?此外,最好检查发布/订阅中最早的ack消息,看看系统是否能跟上处理的进度。hi@JayadeepJayaraman,来自应用程序的屏幕截图被取消,因此水印仅声明
Max watermark
。关于未确认的消息,我们确实有积压,但我会有assumed输入也应该有相同的数字,因为其中一个PCollection是从发布/订阅中提取的。您是否使用了累加FiredPanes或丢弃FiredPanes?您好,谢谢您的响应,将触发器更改为基于事件时间与处理时间是否会使其成为确定性触发器?我也尝试过,不是吗e任何改进。请告知是否有解决方案可以避免这种情况。如果这与此问题没有直接关系,我可以创建一个单独的解决方案。如果您仅使用
AfterWatermark.pastEndOfWindow()
(默认设置)你不应该有这些问题。你好@robertwb,谢谢。我以前确实尝试过,但它没有触发
CoGroupByKey
下游的任何步骤,我已经删除了
CoGroupByKey
,并编写了一个自定义pardo,它在一个步骤中执行查询和加入,因此我无法快速测试旧流程,将在这里进行测试和更新。我将把这个答案标记为接受,因为它确实解释了所处理元素中的差异。