Google cloud platform 数据流作业卡住,无法从PubSub读取消息

Google cloud platform 数据流作业卡住,无法从PubSub读取消息,google-cloud-platform,google-cloud-dataflow,google-cloud-pubsub,Google Cloud Platform,Google Cloud Dataflow,Google Cloud Pubsub,我有一个数据流作业,它从3个PubSub主题读取JSON,将它们放在一个主题中,应用一些转换并保存到BigQuery 我正在使用具有以下配置的GlobalWindow .apply(Window.<PubsubMessage>into(new GlobalWindows()).triggering(AfterWatermark.pastEndOfWindow() .withEarlyFirings(AfterFirst.of(A

我有一个数据流作业,它从3个PubSub主题读取JSON,将它们放在一个主题中,应用一些转换并保存到BigQuery

我正在使用具有以下配置的GlobalWindow

.apply(Window.<PubsubMessage>into(new GlobalWindows()).triggering(AfterWatermark.pastEndOfWindow()
                            .withEarlyFirings(AfterFirst.of(AfterPane.elementCountAtLeast(20000),
                                    AfterProcessingTime.pastFirstElementInPane().plusDelayOf(durations))))
                            .discardingFiredPanes());

我面临的问题是,在处理少量消息(约80k)后,作业停止从PubSub读取消息。其中一个主题中有将近1000万条积压的消息,但数据流作业并没有读取消息或自动缩放

我还检查了每个工人的CPU使用情况,在初始突发之后,CPU使用率也保持在一位数

我尝试过改变机器类型和最大工作配置,但似乎没有任何效果


我应该如何处理这个问题?

我怀疑窗口功能是罪魁祸首
GlobalWindow
不适用于流式作业(由于使用了PubSub,我假设此作业是这样),因为在所有元素都存在之前,它不会启动窗口,这在流式上下文中是不会发生的

在您的情况下,当窗口命中元素计数或持续时间时,它看起来会提前触发一次,但在此之后,窗口将被卡住,等待所有元素最终到达。检查是否出现这种情况的一个快速修复方法是重复地将早期触发包在一个
触发器中。永久的
触发器,如下所示:

withEarlyFirings(
    Repeatedly.forever(
        AfterFirst.of(
            AfterPane.elementCountAtLeast(20000),
            AfterProcessingTime.pastFirstElementInPane().plusDelayOf(durations)))))
这样可以让早期的射击重复进行,防止窗户被卡住


然而,对于更持久的解决方案,我建议不要在流式管道中使用
GlobalWindow
。使用基于元素计数的提前触发的固定时间窗口会给您带来相同的行为,但不会有卡住的风险。

您是否可以重新启动管道并检查问题是否重复发生?是,我尝试重新启动作业5次,但每次都卡在50-60K标记处。即使没有重复
。永远
在管道中累积20K元素后,会发生早期触发。同样的管道在其他环境中也可以正常工作。虽然我会尝试你的解决方案,如果这解决了我的问题,我会更新。问题是,我们迁移到了一个新的子网络,防火墙规则限制了洗牌所需的工人之间的通信。因此,自动缩放后,作业无法进行。
withEarlyFirings(
    Repeatedly.forever(
        AfterFirst.of(
            AfterPane.elementCountAtLeast(20000),
            AfterProcessingTime.pastFirstElementInPane().plusDelayOf(durations)))))