我正在尝试在我的数据流作业中启用自动缩放,如this article中所述。我通过以下代码设置相关算法来做到这一点:
DataflowPipelineOptions options = PipelineOptionsFactory.as(DataflowPipelineOptions.class);
options.setAutoscalingAlgorithm(AutoscalingAlgorithmType.THROUGHPUT_BASED)
在我设置并部署我的工作后,它始终与最大值一起工作。可用的CPU数量,即如果我将最大工作数设置为10,则它使用所有10个CPU,尽管平均CPU使用率约为50%。这个THROUGHPUT_BASED算法如何工作以及我在哪里犯错?
感谢。
答案 0 :(得分:3)
虽然Autoscaling尝试减少积压和CPU,但积压减少优先。特定值积压很重要,Dataflow计算“积压秒数”大致为“积压/吞吐量”,并试图将其保持在10秒以下。
在您的情况下,我认为阻止从10缩减的原因是由于有关用于管道执行的持久磁盘(PD)的策略。当max workers为10时,Dataflow使用10个永久磁盘并尝试随时保留工作器数,以便这些磁盘大致相等地分布。因此,当管道处于10的最大工作时,它会尝试降低到5而不是7或8.此外,它会尝试在缩减后将CPU预测保持在不超过80%。
这两个因素可能会有效地阻止您的缩减。如果10名工作人员的CPU利用率为50%,则5名工作人员的预计CPU利用率为100%,因此它不会缩减,因为它高于目标80%。
Google Dataflow正在开发新的执行引擎,该引擎不依赖于永久磁盘,也不会受到降尺度限制的影响。
解决此问题的方法是设置更高的max_workers,您的管道可能仍然保持在10或更低。但这导致PD的成本略有增加。
另一个遥远的可能性是,即使有足够的CPU,即使在升级估计的“积压秒数”后,有时甚至可能不会保持在10秒以下。这可能是由于各种因素(用户代码处理,pubsub批处理等)。想知道这是否会影响您的管道。