【问题标题】:Dataflow job stuck and not reading messages from PubSub数据流作业卡住并且没有从 PubSub 读取消息
【发布时间】:2020-02-07 04:07:41
【问题描述】:

我有一个数据流作业,它从 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());

作业正在使用以下配置运行

Max Workers : 20
Disk Size: 10GB
Machine Type : n1-standard-4
Autoscaling Algo: Throughput Based

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

我还检查了每个工作人员的 CPU 使用率,并且在初始爆发后也徘徊在个位数。

我已尝试更改机器类型和最大工作人员配置,但似乎没有任何效果。

我应该如何解决这个问题?

【问题讨论】:

  • 您是否可以重新启动管道并检查问题是否反复出现?
  • 是的,我尝试重新启动作业 5 次,但每次都卡在 50-60K 标记处。

标签: google-cloud-platform google-cloud-dataflow google-cloud-pubsub


【解决方案1】:

我怀疑窗口函数是罪魁祸首。 GlobalWindow 不适合流式作业(由于使用了 PubSub,我认为这项作业是),因为在所有元素都存在之前它不会触发窗口,这在流式上下文中永远不会发生。

在您的情况下,看起来窗口会提前触发一次,当它达到该元素计数或持续时间时,但之后窗口将卡住等待所有元素最终到达。检查是否是这种情况的快速解决方法是将早期触发包装在Repeatedly.forever 触发器中,如下所示:

withEarlyFirings(
    Repeatedly.forever(
        AfterFirst.of(
            AfterPane.elementCountAtLeast(20000),
            AfterProcessingTime.pastFirstElementInPane().plusDelayOf(durations)))))

这应该允许早期触发重复触发,防止窗口卡住。

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

【讨论】:

  • 即使没有Repeatedly.forever,在管道中累积 20K 元素之后,也会发生早期触发。相同的管道在其他环境中也可以正常工作。虽然我会尝试你的解决方案,如果能解决我的问题,我会更新。
  • 原来问题是我们迁移到了一个新的子网络,在该子网络中,防火墙规则限制了工作人员与工作人员之间进行 shuffle 所需的通信。因此,在自动缩放后,作业无法进行。
猜你喜欢
  • 2022-01-04
  • 2021-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多