PCollection中的项目数不影响分配的工人数

问题描述

我有一个包含三个步骤的管道。在第一步中,这是一个ParDo,它在PCollection中接受5个URL。这5个项目中的每一个都会生成数千个网址并将其输出。因此,第二步的输入是另一个PCollection,其大小可以为100-400k。在最后一步中,每个网址的抓取的输出将保存到存储服务中。

我已经注意到,从5个输入URL中生成URL列表的第一步分配了5个worker,并生成了一组新的URL。但是,第一步完成后,没有任何工作程序会减少并达到1。而在第二步运行时,它仅在1个工作程序中运行(如果有1个工作程序,我的数据流将运行最近2天,所以通过查看日志,我可以得出一个完成第一步的逻辑假设)。

所以我的问题是,尽管PCollection的规模很大,但为什么它没有在工人之间分配,或者为什么没有分配更多的工人呢?第2步是一个简单的Web抓取工具,它可以抓取给定的URL并输出一个字符串。然后将其保存到存储服务

解决方法

Dataflow尝试将步骤连接在一起以创建融合步骤。因此,即使您的管道中ParDo很少,它们也会融合在一起,并且将作为一个步骤执行。

此外,一旦融合,Dataflow的扩展将受到融合步骤开始时的步骤的限制。

我怀疑您有一个Create转换,其中包含管道顶部的几个元素。在这种情况下,数据流只能在此Create转换中扩展到最多元素个数。

防止这种行为的一种方法是在一个(或多个)高扇出ParDo变换之后进行中断融合。这可以通过在其后添加一个Reshuffle.viaRandomKey()转换(包含一个GroupByKey)来完成。鉴于Reshuffle是身份转换,您的管道不需要进行其他更改。

有关融合和防止融合的更多信息,请参见here