纵向自动扩缩

纵向自动扩缩功能可让 Dataflow Prime 对工作器的可用内存进行动态纵向扩容或纵向缩容以满足作业要求。此功能旨在使作业能够灵活应对内存不足 (OOM) 错误,并最大限度地提高流水线效率。Dataflow Prime 会监控流水线,检测工作器缺少或超出可用内存的情况,然后将这些工作器替换为具有更多或更少内存的新工作器。

重要提示:由于纵向自动扩缩会将现有工作器替换为新工作器,因此我们强烈建议您使用自定义容器,以缩短调整工作器大小可能导致的延迟时间。

流式传输

默认情况下,系统会为使用 Dataflow Prime 的所有新流式作业启用纵向自动扩缩。

如果您要通过命令行界面从模板启动作业,则可以通过传递 --additional_experiments=disable_vertical_memory_autoscaling 标志停用纵向自动扩缩功能。

所有 Dataflow Prime 流处理 Java 和 Python 流水线都支持纵向自动扩缩。您可以在不使用 Streaming Engine 的情况下使用 Dataflow Prime 流处理 Java 流水线。但是,为了获得最佳的纵向自动扩缩体验,建议您启用 Streaming Engine。

批处理

对于 Dataflow Prime 批量作业,只有在发生四种内存不足错误后,纵向自动扩缩功能才会纵向扩容。

  • 纵向自动扩缩功能会纵向扩容以防止作业失败,不会纵向缩容。
  • 对于作业的其余部分,整个池会纵向扩容。
  • 如果使用了资源提示并创建了多个池,则每个池都会单独纵向扩容。

对于批量作业,默认情况下不会启用纵向自动扩缩功能。如需为批量作业启用纵向自动扩缩,请设置以下流水线选项:

  • --experiments=enable_batch_vmr
  • --experiments=enable_vertical_memory_autoscaling

如需为批量作业停用纵向自动扩缩,请执行以下操作之一:

  • 请勿设置 --experiments=enable_batch_vmr 流水线选项。
  • 设置 --experiments=disable_vertical_memory_autoscaling 流水线选项。

限制

  • 只有工作器的内存会纵向扩缩。
  • 默认情况下,内存扩缩的上限为 16 GiB(使用 GPU 时为 26 GiB),下限为 6 GiB(使用 GPU 时为 12 GiB)。提供资源提示,告知可以更改上限和下限。
  • 使用 A100 GPU 的池不支持纵向自动扩缩。
  • 对于批量作业,包含失败项的软件包可能会在流水线完全失败之前重试多次(超过 4 次)。
  • VPC Service Controls 不支持纵向自动扩缩。如果您启用 Dataflow Prime 并在 VPC Service Controls 边界内启动新作业,则该作业会使用不具有纵向自动扩缩的 Dataflow Prime

监控纵向自动扩缩

纵向自动扩缩操作会发布到作业和工作器日志。如需查看这些日志,请参阅 Dataflow 作业指标

对横向自动扩缩的影响

Dataflow Prime 中,纵向自动扩缩与横向自动扩缩协同工作。这种组合使 Dataflow Prime 能够无缝扩缩工作器以最好地满足流水线需求,并最大限度地提高计算容量的利用率。

从设计上来说,纵向自动扩缩(调整工作器内存)的频率低于横向自动扩缩(调整工作器数量)。在纵向自动扩缩触发更新期间以及之后 10 分钟内,横向自动扩缩功能会停用。如果在这 10 分钟后存在大量积压的输入数据,横向自动扩缩可能会清除该积压。如需了解流处理流水线的横向自动扩缩,请参阅流式自动扩缩

问题排查

本部分介绍如何排查与纵向自动扩缩相关的常见问题。

纵向自动扩缩似乎不起作用

如果纵向自动扩缩不起作用,请检查以下作业详情。

  • 检查以下作业消息以验证纵向自动扩缩是否处于活跃状态:Vertical Autoscaling is enabled. This pipeline is receiving recommendations for resources allocated per worker.

    如果缺少此消息,则表示纵向自动扩缩未运行。

  • 对于流处理流水线,请验证已设置 enable_vertical_memory_autoscaling 标志。对于批处理流水线,请验证已设置 enable_vertical_memory_autoscalingenable_batch_vmr 标志。

  • 验证您已为 Google Cloud 项目启用 Cloud Autoscaling API。 启用 API

  • 验证您的作业正在运行 Dataflow Prime。如需了解详情,请参阅启用 Dataflow Prime

作业观察到高积压和高水印

以下说明仅适用于流式作业。如果工作器的纵向重塑时间超过几分钟,作业可能会显示输入数据的高积压和高水印。如需在 Python 流水线中解决此问题,我们强烈建议您使用自定义容器,因为它们可以缩短重塑工作器时可能产生的延迟时间。如需在 Java 流水线中解决此问题,我们强烈建议您启用 Streaming EngineRunner v2。如果启用这些功能后问题仍然存在,请与客户服务联系。

纵向自动扩缩已达到内存容量上限。

默认情况下,如果未提供资源提示,纵向自动扩缩不会将内存扩缩到超过每个工作器 16 GiB(使用 GPU 时为 26 GiB)或小于每个工作器 6 GiB(使用 GPU 时为 12 GiB)。达到这些限制后,Cloud Logging 中会生成以下任一日志消息。

流式作业:

Vertical Autoscaling has a desire to upscale memory, but we have hit the memory scaling limit of X GiB. This is only a problem if the pipeline continues to see memory throttling and/or OOMs.

批量作业:

Vertical Autoscaling has a desire to upscale memory, but we have hit the memory scaling limit of 16.0 GiB. Job will fail because we have upsized to maximum size, and the pipeline is still OOMing.

如果您的流水线仍然出现内存不足错误,您可以使用资源提示,通过指定 min_ram="numberXB" 来定义转换的内存要求。此设置可让 Dataflow 为您的工作器选择初始配置,这种配置可以支持更高的内存容量。但是,更改此初始配置可能会增加流水线可用的潜在并行性。如果您有内存耗尽的转换,则由于可用并行性增加,这可能会导致流水线使用的内存比以前多。在这种情况下,您可能需要优化转换以减少其内存占用量。

注意:纵向自动扩缩不会阻止 OOM 错误出现在工作器日志中。如果发生 OOM 错误,则它在工作器日志中可见,因为纵向自动扩缩会查找并跟踪 OOM 事件。

工作器内存限制不稳定,并且会在内存使用量不变的情况下随着时间而增加和减少

以下说明仅适用于流式作业。对于 Java 流水线,请启用 Streaming EngineRunner v2。如果问题仍然存在,或者您在 Python 流水线中观察到此行为,请与客户服务联系。

常见日志消息

本部分介绍启用纵向自动扩缩时生成的常见日志消息。

垂直自动扩缩已启用。此流水线正在接收按工作器分配的资源的建议。

此消息表明纵向自动扩缩处于有效状态。如果缺少此消息,则表示工作器池中未运行纵向自动扩缩。

如果纵向自动扩缩未处于活跃状态,请参阅纵向自动扩缩似乎不起作用。我应该检查什么?以获取问题排查说明。

触发纵向自动扩缩更新,以将池的每个工作器内存限制从 X GiB 更改为 Y GiB。

此消息表明纵向自动扩缩已触发工作器池内存大小的调整。