数据流不同操作无法扩展

时间:2018-07-11 17:07:00

标签: performance google-cloud-dataflow apache-beam autoscaling

我有一个带有“最终”级的线性管线,每秒可输出约200k个元素(短字符串)。

但是,当我在该阶段(myPCollection.apply(Distinct.<String>create());之后添加Distinct操作时,Distinct之前阶段的速度下降到每秒处理约80k元素。

但是,我正在处理没有最大数量的工作人员的有界集合,因此我希望Dataflow能够自动增加工作人员的数量以匹配工作量。不仅不会发生这种情况,而且当我手动启动具有许多工作人员(超过20个)的管道时,它会自动缩小为几个工作人员。

如何使Dataflow扩展工作池,以使此Distinct操作不会显着降低管道的处理速率?

1 个答案:

答案 0 :(得分:2)

看看the implementation of Distinct可能很有趣。

如您所见,它首先将元素分组,然后再拾取第一个元素。我已提交a bug来改善此行为。

在当前实现中,所有元素首先进行分组,这要求将它们写入持久性存储,然后再提取。如果您有多次出现的元素(即热键),则会遇到可写多少数据的瓶颈。

作为一个技巧,您可以添加一个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函数之前使用它,并希望它具有更好的性能。