Performance 数据流不同操作不可缩放

Performance 数据流不同操作不可缩放,performance,google-cloud-dataflow,apache-beam,autoscaling,Performance,Google Cloud Dataflow,Apache Beam,Autoscaling,我有一个线性管道,最后一个阶段每秒输出大约200k个元素和短字符串 但是,当我在该阶段myPCollection.applyDistinct.create;之后添加一个独特的操作时;,在Distinct之前的阶段速度下降到每秒处理80k左右的元素 但是,我正在处理一个没有最大工作人数的有界集合,因此我希望Dataflow自动增加工作人数以匹配工作负载。这不仅没有发生,当我用20+的工人手动启动管道时,它会自动缩小到几个工人 我如何使数据流向上扩展工作池,以便这种独特的操作不会显著降低管道的处理速

我有一个线性管道,最后一个阶段每秒输出大约200k个元素和短字符串

但是,当我在该阶段myPCollection.applyDistinct.create;之后添加一个独特的操作时;,在Distinct之前的阶段速度下降到每秒处理80k左右的元素

但是,我正在处理一个没有最大工作人数的有界集合,因此我希望Dataflow自动增加工作人数以匹配工作负载。这不仅没有发生,当我用20+的工人手动启动管道时,它会自动缩小到几个工人


我如何使数据流向上扩展工作池,以便这种独特的操作不会显著降低管道的处理速度?

这可能是一个有趣的研究

如您所见,它首先对元素进行分组,然后选择第一个元素。我已经申请改善这种行为

在当前的实现中,首先对所有元素进行分组,这需要将它们写入持久性存储,然后再进行拾取。如果您有任何元素出现多次,即热键,那么您将在写入多少数据方面遇到瓶颈

作为一个技巧,您可以添加一个DoFn,该DoFn在写入元素之前对元素进行重复数据消除。大概是这样的:

class MapperDedupFn extends DoFn<String, String> {
    Set<String> seenElements;
    MapperDedupFn() {
      seenElements = new HashSet<>();
    }

    @ProcessElement
    public void processElement(@Element String element, OutputReceiver<String> receiver) {
      if (seenElements.contains(element)) return;

      seenElements.add(element)
      receiver.output(word);
    }
  }
}

您应该能够在使用Distinct函数之前坚持这一点,并希望有更好的性能。

非常感谢您的回答。然而,在对代码进行了一点重构并完全删除了不同的操作之后,我意识到我的管道仍然无法扩展,即使某些阶段有数百万项的积压工作!我的管道仅由几个dofn以线性方式组成。想想TextIO.read fast-一些处理DoFn快-一个匹配的DoFn慢-TextIO.write fast。即使是DoFn,管道也无法扩展以弥补缓慢的DoFn。你有什么见解可以解释这种行为吗?非常感谢。很乐意帮忙。你说的“匹配”是什么意思?请随时将您的问题发送至user@beam.apache.org,或者开始一个我可以回答的新问题,把它链接到这里,这样我发现它。经过一些研究,我认为这个问题是从一个到多个阶段开始的,并引发了一场争论。谢谢