Dataflow 费用优化最佳实践

本文档介绍了以尽可能降低费用为目标优化 Dataflow 作业的最佳实践。该文档介绍了影响费用的因素,并提供了监控和管理这些费用的技术。

如需详细了解如何计算 Dataflow 作业的费用,请参阅 Dataflow 价格

以下几个因素可能会对作业费用产生很大影响:

  • 运行时设置
  • 流水线性能
  • 流水线吞吐量要求

以下部分详细介绍了如何监控作业、影响作业费用的因素,以及有关如何提高流水线效率的建议。

定义 SLO

在开始优化之前,请定义流水线的服务等级目标 (SLO),尤其是吞吐量和延迟时间。这些要求有助于您推理费用与其他因素之间的权衡。

  • 如果您的流水线需要较短的端到端注入延迟时间,流水线费用可能会较高。
  • 如果您需要处理延迟到达的数据,总体流水线费用可能会更高。
  • 如果您的流式传输流水线有需要处理的数据高峰,则流水线可能需要额外的容量,这可能会增加费用。

监控作业

若要确定如何优化作业,您需要先了解其行为。使用 Dataflow 监控工具观察流水线的运行情况。然后,利用这些信息来提升性能和效率。

费用监控

使用以下方法预测和监控费用。

  • 在生产环境中运行流水线之前,请先对数据的子集运行一个或多个较小的作业。对于许多流水线,此方法可以提供费用估算。
  • 您可以使用 Dataflow 监控界面中的费用页面监控作业的估算费用。由于各种原因(例如合同折扣),估算费用可能无法反映实际作业费用,但可以为优化费用提供良好的基准。如需了解详情,请参阅费用监控
  • 将 Cloud Billing 数据导出到 BigQuery,并对导出的账单表格执行费用分析。借助 Cloud Billing 导出功能,您可以将详细的 Google Cloud 结算数据全天自动导出到 BigQuery 数据集。结算数据包括使用情况、费用估算值和价格数据。
  • 为避免产生意外费用,请在 Dataflow 作业超出您定义的阈值时创建监控提醒。如需了解详情,请参阅对 Dataflow 流水线使用 Cloud Monitoring

作业监控

监控作业,找出可以提高流水线效率的方面。

  • 使用 Dataflow 作业监控界面可找出流水线中的问题。监控界面会显示每个流水线的作业图执行详情。这两种工具都可以帮助您了解流水线,并找出运行缓慢的阶段、卡住的阶段或实际运行时间过长的步骤。
  • 您可以使用 Metrics Explorer 查看详细的 Dataflow 作业指标。您可以使用自定义指标来捕获性能数据。Distribution 指标对于收集性能数据特别有用。
  • 对于 CPU 密集型流水线,请使用 Cloud Profiler 确定流水线代码中资源耗用量最大的部分。
  • 使用数据抽样来找出数据存在的问题。通过数据抽样,您可以在 Dataflow 流水线的每个步骤中观察数据。此信息可显示正在运行或已完成的作业的实际输入和输出,从而帮助您调试流水线问题。

不建议在高吞吐量流水线中记录每个元素的处理指标,因为日志记录受限制,过多日志记录可能会降低作业性能。

优化运行时设置

以下运行时设置可能会影响费用:

  • 您运行的是流式作业还是批量作业
  • 您使用哪项服务来运行作业,例如 Streaming Engine 或 FlexRS
  • 工作器虚拟机中的机器类型、磁盘大小和 GPU 数量
  • 自动扩缩模式
  • 初始工作器数量和工作器数量上限
  • 流处理模式(“正好一次”模式或“至少一次”模式)

本部分介绍了您可以进行哪些可能的更改来优化作业。 如需确定这些建议是否适合您的工作负载,请考虑您的流水线设计和要求。并非所有建议都适用于所有流水线,也并非所有建议都很有用。

在进行任何大规模更改之前,请先在使用数据子集的小型流水线上测试更改。如需了解详情,请参阅“大批量流水线的最佳实践”中的针对大型作业运行小型实验

工作地点

大多数 Dataflow 作业都会与其他服务(例如数据存储空间和消息传递系统)进行交互。考虑这些元素的位置。

  • 请在作业使用的资源所在的区域运行作业。
  • 在与作业所在的区域相同的区域中创建 Cloud Storage 存储桶,以存储暂存区和临时作业文件。如需了解详情,请参阅 gcpTempLocationtemp_location 流水线选项

调整机器类型

对工作器虚拟机进行以下调整可能会提高成本效益。

  • 使用所需的最小机器类型运行作业。根据流水线要求,根据需要调整机器类型。例如,对于包含 CPU 密集型流水线的流式作业,有时更改机器类型(从默认机器类型更改)会有所帮助。如需了解详情,请参阅机器类型
  • 对于内存密集型或计算密集型工作负载,请使用适当的机器类型。如需了解详情,请参阅虚拟机的 CoreMark 得分(按系列)
  • 设置初始工作器数量。当作业扩容时,必须将工作重新分配给新的虚拟机。如果您知道作业需要多少个工作器,则可以通过设置初始工作器数量来避免此类费用。如需设置初始工作器数量,请使用 numWorkersnum_workers 流水线选项
  • 设置工作器数量上限。通过为此参数设置值,您或许可以限制作业的总费用。首次测试流水线时,请先设置较低的上限。然后,将该值增大到足以运行生产工作负载的大小。在设置上限之前,请考虑您的流水线 SLO。如需了解详情,请参阅横向自动扩缩
  • 某些流水线在使用 GPU 后会受益。如需了解详情,请参阅将 GPU 与 Dataflow 搭配使用
  • 确保您有足够的网络带宽来访问工作器虚拟机中的数据,尤其是当您需要访问本地数据时。

优化批量作业的设置

本部分提供了有关优化批处理作业运行时设置的建议。对于批处理作业,作业阶段会按顺序执行,这可能会影响性能和费用。

使用灵活资源调度服务

如果您的批量作业不受时间限制,不妨考虑使用灵活资源调度 (FlexRS)。FlexRS 通过确定启动作业的最佳时间,然后结合使用抢占式虚拟机实例和标准虚拟机,来降低批处理费用。与标准虚拟机相比,抢占式虚拟机的价格要低得多,这可以降低总费用。通过结合使用抢占式虚拟机和标准虚拟机,FlexRS 有助于确保您的流水线能够继续运行,即使 Compute Engine 抢占了抢占式虚拟机也是如此。

避免运行非常小的作业

在可行的情况下,避免运行处理极少量数据的作业。如果可能,请对较大的数据集运行较少的作业。启动和停止工作器虚拟机会产生费用,因此针对更多数据运行更少的作业可以提高效率。

确保已启用 Dataflow Shuffle。默认情况下,批量作业使用 Dataflow Shuffle。

调整自动扩缩设置

默认情况下,批处理作业使用自动扩缩功能。对于某些作业(例如短时运行作业),不需要自动扩缩。如果您认为流水线无法从自动扩缩中受益,请将其关闭。如需了解详情,请参阅横向自动扩缩

您还可以使用动态线程伸缩,让 Dataflow 根据 CPU 利用率调整线程数。或者,如果您知道作业的最佳线程数,请使用 numberOfWorkerHarnessThreadsnumber_of_worker_harness_threads 流水线选项明确设置每个工作器的线程数。

停止长时间运行的作业

将作业设置为在超过预定的运行时间后自动停止。如果您大致知道作业的运行时间,请使用 max_workflow_runtime_walltime_seconds 服务选项,以便在作业运行时间超出预期时自动停止作业。

优化流式作业的设置

本部分提供了有关优化流式作业运行时设置的建议。

使用 Streaming Engine

Streaming Engine 会将流水线执行从工作器虚拟机移出并移入 Dataflow 服务后端,以提高效率。建议为流式作业使用 Streaming Engine。

考虑使用“至少一次”模式

Dataflow 支持两种流处理作业模式:“正好一次”模式和“至少一次”模式。如果您的工作负载可以容忍重复记录,“至少一次”模式可以显著降低作业的费用。在启用“至少一次”模式之前,请评估您的流水线是否需要对记录进行一次性处理。如需了解详情,请参阅设置流水线流处理模式

选择价格模式

Dataflow 流式作业的承诺使用折扣 (CUD) 提供折扣价格,以换取您承诺在一年或更长时间内持续使用一定数量的 Dataflow 计算资源。如果您在流式作业的 Dataflow 计算容量的支出涉及可预测的最低费用(您可以承诺至少一年),则 Dataflow CUD 非常有用。通过使用 CUD,您或许可以降低 Dataflow 作业的费用。

此外,您还可以考虑使用基于资源的结算模式。使用基于资源的结算模式时,作业消耗的 Streaming Engine 资源按 Streaming Engine 计算单元来计量和衡量。您需要为工作器 CPU、工作器内存和 Streaming Engine 计算单元付费。

调整自动扩缩设置

使用自动扩缩提示来调整自动扩缩设置。如需了解详情,请参阅调整流处理流水线的横向自动扩缩。对于使用 Streaming Engine 的流处理作业,您可以更新自动调整设置,而无需停止或替换作业。如需了解详情,请参阅运行中作业选项更新

如果您认为自动扩缩对流水线没有益处,请将其停用。如需了解详情,请参阅横向自动扩缩

如果您知道作业的最佳线程数,请使用 numberOfWorkerHarnessThreadsnumber_of_worker_harness_threads 流水线选项明确设置每个工作器的线程数。

停止长时间运行的作业

对于流处理作业,Dataflow 会无限期地重试失败的工作项。作业未终止。但作业可能会停滞,直至问题得到解决。创建监控政策以检测停滞的流水线的迹象,例如系统延迟时间增加和数据新鲜度下降。在流水线代码中实施错误日志记录,以帮助识别反复失败的工作项。

流水线性能

运行速度更快的流水线可能费用更低。以下因素可能会影响流水线性能:

  • 可供作业使用的并行度
  • 流水线中使用的转换、I/O 连接器和编码器的效率
  • 数据位置

若要提升流水线性能,第一步是了解处理模型:

  • 了解 Apache Beam 模型Apache Beam 执行模型
  • 详细了解流水线生命周期,包括 Dataflow 如何管理并行化以及它使用的优化策略。Dataflow 作业使用多个工作器虚拟机,每个工作器运行多个线程。PCollection 中的元素软件包会分发到每个工作器线程。

编写流水线代码时,请遵循以下最佳实践:

日志记录

进行日志记录时,请遵循以下最佳实践:

测试

测试流水线有许多好处,包括帮助进行 SDK 升级、流水线重构和代码审核。许多优化(例如重新处理 CPU 密集型自定义转换)都可以在本地进行测试,而无需在 Dataflow 上运行作业。

使用适用于工作负载的真实测试数据测试大规模流水线,包括批处理流水线的元素总数、流式传输流水线的每秒元素数、元素大小和键数。您可以通过以下两种模式测试流水线:在稳定状态下测试,以及处理大量积压作业以模拟崩溃恢复。

如需详细了解如何创建单元测试、集成测试和端到端测试,请参阅测试您的流水线。如需查看测试示例,请参阅 dataflow-ordered-processing GitHub 代码库。

后续步骤