我正在使用如下所示的过程从 Beam 中的 Google Storage 读取文件:
data = pipeline | beam.Create(['gs://my/file.pkl']) | beam.ParDo(LoadFileDoFn)
Run Code Online (Sandbox Code Playgroud)
WhereLoadFileDoFn加载文件并从中创建对象的 Python 列表,ParDo然后以PCollection.
我知道我可能会实现一个自定义源来实现类似的功能,但是这个答案和 Beam自己的文档表明这种使用伪数据集读取的ParDo方法并不少见,并且自定义源可能有点矫枉过正。
它也有效 - 我得到了PCollection正确数量的元素,我可以随心所欲地处理它!然而..
结果PCollection在 Cloud Dataflow 上根本不会自动缩放。我首先必须通过以下方式对其进行转换:
shuffled_data = data | beam.Shuffle()
Run Code Online (Sandbox Code Playgroud)
我知道我也在上面链接的这个答案几乎解释了这个过程 - 但它没有提供任何关于为什么这是必要的见解。就我在 Beam 非常高的抽象级别所看到的而言,我PCollection在洗牌之前有 N 个元素,在洗牌PCollection之后有一个类似的元素。为什么一个可以缩放,而另一个不缩放?
在这种情况下,文档不是很有帮助(或者一般来说,但这是另一回事)。第一个PCollection有什么隐藏属性可以防止它被分发给另一个没有的多个工作人员?