本文档介绍了旨在尽可能降低费用的 Dataflow 作业优化最佳实践。还介绍了影响费用的因素,并提供了监控和管理这些费用的技术。
如需详细了解如何计算 Dataflow 作业的费用,请参阅 Dataflow 价格。
以下几个因素可能会对作业费用产生很大的影响:
- 运行时设置
- 流水线性能
- 流水线吞吐量要求
以下部分详细介绍了如何监控作业、影响作业费用的因素,以及如何提高流水线效率的建议。
定义 SLO
在开始优化之前,先定义流水线的服务等级目标 (SLO),尤其是吞吐量和延迟时间。这些要求将有助于您推断费用与其他因素之间的权衡。
- 如果您的流水线需要较低的端到端提取延迟时间,则流水线费用可能会更高。
- 如果您需要处理延迟到达数据,总体流水线费用可能会更高。
- 如果您的流式流水线具有需要处理的数据峰值,则流水线可能需要额外的容量,这可能会增加费用。
监控作业
如需确定如何优化作业,您首先需要了解其行为。使用 Dataflow 监控工具观察流水线的运行情况。然后使用此信息来提高性能和效率。
费用监控
请使用以下方法来预测和监控费用。
- 在生产环境中运行流水线之前,先对数据的子集运行一个或多个较小的作业。对于许多流水线,此方法可以提供费用估算。
- 使用 Dataflow 监控界面中的费用页面可监控作业的估算费用。出于多种原因(例如合同折扣),估算费用可能无法反映实际作业费用,但可以为费用优化提供良好的基准。如需了解详情,请参阅费用监控。
- 将 Cloud Billing 数据导出到 BigQuery,并对结算导出表执行费用分析。借助 Cloud Billing 导出,您可以全天自动将详细的 Google Cloud 结算数据导出到 BigQuery 数据集。结算数据包括用量、费用估算和价格数据。
- 为避免产生意外费用,请在 Dataflow 作业超出您定义的阈值时创建监控提醒。如需了解详情,请参阅将 Cloud Monitoring 用于 Dataflow 流水线。
作业监控
监控作业,并识别可以提高流水线效率的方面。
- 使用 Dataflow 作业监控界面来识别流水线中存在的问题。监控界面会显示每个流水线的作业图表和执行详细信息。这两种工具都可以帮助您了解流水线,并识别缓慢的阶段、卡住的阶段或实际用时过长的步骤。
- 使用 Metrics Explorer 查看详细的 Dataflow 作业指标。您可以使用自定义指标来捕获性能数据。
Distribution
指标对于收集性能数据特别有用。 - 对于 CPU 密集型流水线,请使用 Cloud Profiler 识别流水线代码中资源耗用量最大的部分。
- 使用数据抽样来识别数据问题。借助数据抽样,您可以在 Dataflow 流水线的每个步骤中观察数据。此信息可显示正在运行或已完成的作业的实际输入和输出,从而帮助您调试流水线问题。
- 自定义项目监控信息中心,以显示可能耗费较多资源的作业。如需了解详情,请参阅自定义 Dataflow 监控信息中心。
不建议在高容量流水线中记录每个元素的处理指标,因为日志记录会受到限制,过多的日志记录可能会降低作业性能。
优化运行时设置
以下运行时设置可能会影响费用:
- 您运行的是流式作业还是批量作业
- 您使用哪种服务运行作业,例如 Streaming Engine 或 FlexRS
- 工作器虚拟机中的机器类型、磁盘大小和 GPU 数量
- 自动扩缩模式
- 初始工作器数量和工作器数量上限
- 流处理模式(“正好一次”模式或“至少一次”模式)
本部分介绍了您可以进行的潜在更改,以优化作业。 如需确定这些建议是否适合您的工作负载,请考虑您的流水线设计和要求。并非所有建议都适合或有助于所有流水线。
在进行任何大规模更改之前,先在使用部分数据的小型流水线上测试更改。如需了解详情,请参阅“大批量流水线的最佳实践”中的针对大型作业运行小型实验。
作业位置
大多数 Dataflow 作业会与其他服务(例如数据存储区和消息传递系统)进行互动。请考虑这些服务的位置。
- 在与您的作业所使用的资源相同的区域中运行您的作业。
- 创建 Cloud Storage 存储桶,以便在与您的作业相同的区域中存储暂存文件和临时作业文件。如需了解详情,请参阅
gcpTempLocation
和temp_location
流水线选项。
调整机器类型
对工作器虚拟机进行以下调整可能会提高成本效益。
- 使用所需的最小机器类型运行作业。根据流水线要求,按需调整机器类型。例如,使用 CPU 密集型流水线的流式作业有时会从更改机器类型为默认值中受益。如需了解详情,请参阅机器类型。
- 对于内存密集型或计算密集型工作负载,请使用适当的机器类型。如需了解详情,请参阅虚拟机的 CoreMark 得分(按系列)。
- 设置初始工作器数量。作业纵向扩容时,必须将工作重新分配到新的虚拟机。如果您知道作业需要的工作器数量,则可以通过设置初始工作器数量来避免此费用。如需设置初始工作器数量,请使用
numWorkers
或num_workers
流水线选项。 - 设置工作器数量上限。通过为此参数设置值,您可以限制作业的总费用。首次测试流水线时,先从相对较低的最大值开始。然后,提高该值,直到其足以运行生产工作负载。在设置最大值之前,考虑您的流水线 SLO。如需了解详情,请参阅横向自动扩缩。
- 使用适配自定义特定流水线步骤的资源要求。
- 某些流水线可以从使用 GPU 中受益。如需了解详情,请参阅将 GPU 与 Dataflow 搭配使用。通过使用适配,您可以为流水线的特定步骤配置 GPU。
- 确保您有足够的网络带宽来从工作器虚拟机访问数据,尤其是在您需要访问本地数据时。
优化批量作业的设置
本部分提供了有关优化批量作业运行时设置的建议。对于批量作业,作业阶段会依序执行,这可能会影响性能和费用。
使用灵活资源调度服务
如果您的批量作业不受时间限制,请考虑使用灵活资源调度 (FlexRS)。FlexRS 通过查找启动作业的最佳时间,然后结合使用抢占式虚拟机实例和标准虚拟机,来降低批处理费用。与标准虚拟机相比,抢占式虚拟机的价格要低得多,这可以降低总费用。通过结合使用抢占式虚拟机和标准虚拟机,FlexRS 有助于确保您的流水线继续运行,即使 Compute Engine 抢占了抢占式虚拟机。
避免运行非常小的作业
在可行的情况下,请避免运行处理极少量数据的作业。如果可能,请在较大的数据集上运行较少的作业。启动和停止工作器虚拟机会产生费用,因此在更多数据上运行更少的作业可以提高效率。
确保已启用 Dataflow Shuffle。默认情况下,批量作业使用 Dataflow Shuffle。
调整自动扩缩设置
默认情况下,批量作业使用自动扩缩。对于某些作业(例如短时间运行的作业),无需自动扩缩。如果您认为流水线无法从自动扩缩中受益,请将其关闭。如需了解详情,请参阅横向自动扩缩。
您还可以使用动态线程扩缩让 Dataflow 根据 CPU 利用率调整线程数。或者,如果您知道作业的最佳线程数,请使用 numberOfWorkerHarnessThreads
或 number_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 的流式作业,您可以更新自动调整设置,而无需停止或替换作业。如需了解详情,请参阅运行中作业选项更新。
如果您认为流水线无法从自动扩缩中受益,请将其关闭。如需了解详情,请参阅横向自动扩缩。
如果您知道作业的最佳线程数,请使用 numberOfWorkerHarnessThreads
或 number_of_worker_harness_threads
流水线选项明确设置每个工作器的线程数。
停止长时间运行的作业
对于流处理作业,Dataflow 会无限期地重试失败的工作项。作业未终止。但作业可能会停滞,直至问题得到解决。创建监控政策以检测停滞的流水线的迹象,例如系统延迟时间增加和数据新鲜度下降。在流水线代码中实施错误日志记录,以帮助识别反复失败的工作项。
- 如需监控流水线错误,请参阅工作器错误日志计数。
- 如需排查错误,请参阅排查 Dataflow 错误。
流水线性能
运行速度更快的流水线可能会降低费用。以下因素可能会影响流水线性能:
- 您的作业可用的并行处理
- 流水线中使用的转换、I/O 连接器和编码器的效率
- 数据位置
提高流水线性能的第一步是了解处理模型:
- 了解 Apache Beam 模型和 Apache Beam 执行模型。
- 详细了解流水线生命周期,包括 Dataflow 如何管理并行处理及其使用的优化策略。Dataflow 作业使用多个工作器虚拟机,并且每个工作器均会运行多个线程。
PCollection
中的元素包会分发给每个工作器线程。
在编写流水线代码时,请遵循以下最佳实践:
- 尽可能使用最新的受支持的 Apache Beam SDK 版本。关注版本说明,了解不同版本的变化。
- 遵循编写流水线代码的最佳实践。
- 遵循 I/O 连接器最佳实践。
- 对于 Python 流水线,请考虑使用自定义容器。 预先打包依赖项可缩短工作器启动时间。
日志记录
在记录日志时,请遵循以下最佳实践:
测试
测试流水线有许多好处,包括帮助进行 SDK 升级、流水线重构和代码审核。许多优化(例如重新处理自定义 CPU 密集型转换)都可以在本地进行测试,而无需在 Dataflow 上运行作业。
使用真实的工作负载测试数据测试大规模流水线,包括批处理流水线的元素总数、流式流水线的每秒元素数量、元素大小和键数量。您可以通过两种模式测试流水线:在稳定状态下,以及处理大量积压工作以模拟崩溃恢复。
如需详细了解如何创建单元测试、集成测试和端到端测试,请参阅测试您的流水线。
如需查看测试示例,请参阅 dataflow-ordered-processing
GitHub 代码库。