我有一个ParDo转换,我在其中进行阻止Web服务调用以获取一些数据。通话需要一段时间才能返回(比如大约1分钟)。我观察到这个ParDo变换不会扩展太多(我正在使用自动缩放模式),即使调用了相当大的PCollection。也许这是因为只有在CPU /内存利用率很高的情况下才会进行扩展,在我的情况下,CPU /内存消耗可能很低,因为大部分时间花在等待网络调用返回上。最终结果是,由于不会进行扩展,因此只会并行发出少量http请求,并且完成作业需要更长时间。关于如何改善这种情况的任何想法/建议?
谢谢
注意:我正在通过Java SDK 1.9.1使用Google Dataflow,并且愿意转向Apache Beam Java SDK
答案 0 :(得分:3)
实际上,如果工作人员没有充分利用CPU,Dataflow会限制自动缩放。
这主要是为了避免您在管道中阻塞网络调用的情况,并且当我们扩展时,正在进行更多调用并且外部服务过载并变得更慢,因此Dataflow认为要完成的工作总量更大,并且进一步扩展,成为一个积极的反馈循环。对于这种情况,当前的行为也不是最佳的,但它至少没有这种灾难性的失败模式。
我们正在考虑采用不同的方法来实现两全其美,但目前这是一个已知问题,要解决这个问题,您需要明确指定工作人员数量(从而禁用自动缩放),或者也许添加一些烧掉CPU的代码(授予,非常难看)。
答案 1 :(得分:0)
如果这是一个流媒体作业,那么增加阻止ParDo并行度的标准做法是在它之前添加Reshuffle
。见Dataflow streaming job not scaleing past 1 worker
在大多数情况下,越来越多的工作人员并没有在流媒体管道中大大提高并行性/吞吐量。