我的管道看起来大致如下:
_ (
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将负载分配给多个工作人员,即使是非常少量的项目。如果我说有三个项目和三个工人,我希望每个工人执行一个项目。
注意:我禁用了自动缩放功能,并使用了固定数量的工作人员。
答案 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所以你需要使用该链接之一的方法手动编写类似的东西。