使用 Apache Beam Python over Google Dataflow 将小型集合输出分发给多个工作人员

Distribute small collection output to multiple workers using Apache Beam Python over Google Dataflow

我的管道大致如下所示:

_ (
  p |
  SomeSourceProducingListOfFiles() |
  beam.Map(some_expensive_fn) |
  beam.FlatMap(some_inexpensive_agg)
)

SomeSourceProducingListOfFiles 在我的例子中是从单个 CSV/TSV 读取并且当前不支持拆分。

some_expensive_fn 是一个昂贵的操作,可能需要一分钟才能 运行.

some_inexpensive_agg 对于这个问题来说可能不是那么重要,而是为了表明有一些结果汇集在一起​​用于聚合目的。

SomeSourceProducingListOfFiles 产生 100 个项目的情况下,负载似乎没有被拆分到多个作品中。

我了解到,一般来说,Apache Beam 会尝试将事情留给一个工作人员以减少序列化开销。 (并且有 1000 个项目的一些硬编码限制)。我怎样才能说服 Apache Beam 将负载分配给多个工作人员,即使是对于极少数项目也是如此。如果我说有三个项目和三个工人,我希望每个工人执行一个项目。

注意:我禁用了自动缩放并使用了固定数量的工作器。

https://cloud.google.com/dataflow/service/dataflow-service-desc#preventing-fusion discusses ways to prevent fusion. Beam Java 2.2+ has a built-in transform to do this, Reshuffle.viaRandomKey(); Beam Python doesn't yet have it 因此您需要使用 link.

中的一种方法手动编写类似的代码

您可以尝试使用 beam.Reshuffle 吗?这似乎没有很好的记录,但我从一些好的消息来源听说这是你应该使用的。

https://beam.apache.org/documentation/transforms/python/other/reshuffle/