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

时间:2017-12-04 19:58:58

标签: python google-cloud-dataflow apache-beam

我的管道看起来大致如下:

_ (
  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通常会尝试在一个worker上保留一些工作来减少序列化开销。 (并且有1000个项目的硬编码限制)。我怎样才能说服Apache Beam将负载分配给多个工作人员,即使是非常少量的项目。如果我说有三个项目和三个工人,我希望每个工人执行一个项目。

注意:我禁用了自动缩放功能,并使用了固定数量的工作人员。

1 个答案:

答案 0 :(得分:1)

https://cloud.google.com/dataflow/service/dataflow-service-desc#preventing-fusion讨论了防止融合的方法。 Beam Java 2.2+有一个内置的转换,{{1}}; Beam Python doesn't yet have it所以你需要使用该链接之一的方法手动编写类似的东西。