为什么我需要改组PCollection才能在Cloud Dataflow上自动缩放?

时间:2018-12-21 13:06:12

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

上下文

我正在使用类似以下的过程从Beam中的Google存储读取文件:

data = pipeline | beam.Create(['gs://my/file.pkl']) | beam.ParDo(LoadFileDoFn)

LoadFileDoFn会在其中加载文件并从中创建对象的Python列表,然后ParDo会以PCollection的形式返回。

我知道我可能可以实现一个自定义源来实现类似的目的,但是this answer和Beam的own documentation表明,这种通过ParDo读取伪数据集的方法并不罕见,并且自定义来源可能会过分杀人。

它也可以工作-我得到了PCollection,其中包含正确数量的元素,可以根据需要进行处理!但是..

自动缩放问题

生成的PCollection在Cloud Dataflow上根本不会自动缩放。我首先必须通过以下方式对其进行转换:

shuffled_data = data | beam.Shuffle()

我知道this answer也在上面进行了链接,解释了此过程的大部分内容-但它没有提供任何有关为什么这样做的必要见解。就Beam的高度抽象而言,我发现PCollection在混洗之前有N个元素,在混洗之后有类似的PCollection。为什么一个会缩放,而另一个则不会?

在这种情况下(或者通常来说,文档不是很有用),但这是另一回事。第一个PCollection具有什么隐藏属性,可以防止将其分配给其他工人没有的多个工人?

1 个答案:

答案 0 :(得分:3)

当您通过Create阅读时,您正在创建绑定到1个worker的PCollection。由于没有与项目关联的键,因此没有分配工作的机制。 Shuffle()将在封面下创建一个K,V,然后随机播放,这使PCollection项目可以在旋转时分配给新工人。您可以通过关闭自动缩放功能并将工作人员的大小固定为25来验证此行为-如果没有随机播放,您只会看到1个工作人员在工作。

创建/读取时分发此工作的另一种方法是构建自己的自定义I / O以读取PKL文件1。您将创建适当的拆分器;但是,不知道您腌制了什么,可能无法拆分。 IMO Shuffle()是一个安全的选择,您可以通过编写可拆分阅读器的模数来获得优化。