使用“失败时暂停”服务选项来保留 Dataflow 批处理作业的状态。借助此功能,您可以暂停作业执行、解决流水线外部的问题,并在不丢失已完成工作的情况下恢复处理。使用此功能暂停作业后,您无法更改流水线代码或工作器虚拟机配置(例如机器类型)。
启用此功能后,您可以更好地管理资源费用,并在临时中断或配额受限期间提高作业可靠性。您还可以通过在启用“失败时暂停”功能时配置最长暂停时长,进一步掌控流水线生命周期。您还可以手动暂停或恢复启用了 pause-on-failure 标志的流水线。
暂停失败的好处
借助“失败时暂停”服务选项,您可以在中断期间保留批量作业进度,从而减少总计算时间和资源支出。
- 检查点保留:作业失败时,您可以从上次记录的检查点继续执行,而不是从头开始。这样一来,您就不需要重新处理已完成的数据块,这意味着您无需为已成功完成的工作付费。
- 减少外部依赖项:保护流水线免受暂时性问题的影响,例如外部服务中的临时中断或速率限制。暂停作业可让您有机会在恢复执行之前解决根本原因,而不会丢失已完成的工作。
- 处理不确定的故障:对于容易发生间歇性或不确定故障的工作负载,此选项可让您在每次连续尝试时确保增量进度,从而防止作业完全失败。
- 管理资源和配额:暂停低优先级的批处理作业,以暂时释放配额或将 GPU 或 TPU 等高价值资源重新分配给紧急工作负载(例如机器学习模型训练或推理),而不会丢失其基准进度。
支持和限制
暂停作业(手动或因失败而暂停)有以下要求和限制:
- Dataflow 作业必须是批量作业。
- 作业必须使用 Dataflow Shuffle。
- 您必须在运行作业时指定
pause_on_failure服务选项。 - 作业之前不得未能暂停。
失败时暂停作业的行为
启用“失败时暂停”功能后,作业会在工作项失败 4 次后自动暂停。您可以在日志中找到这些失败,它们以包含 Error message from worker 的作业消息和包含 Completed work item ITEM_NUMBER
UNSUCCESSFULLY 的工作器消息的形式呈现。其他类型的失败(例如缺货和配额错误)不会触发自动暂停。相反,这些故障会导致作业正常失败。启用“失败时暂停”功能后,您还可以手动暂停作业。
作业状态转换
当 Dataflow 作业暂停时,它会经历以下状态:
- 暂停:一种中间状态,作业会停止处理、删除工作器虚拟机并归档后端状态。在服务完成删除虚拟机之前,您仍需为这些虚拟机付费。
- 已暂停:作业已完全停止。目前,您只需为已归档的 Shuffle 数据付费。
特殊行为
在以下情况下,暂停失败可能会出现意外行为:
- 如果您手动暂停即将完成的作业,该作业可能会完成,而不是暂停。
- 在极少数情况下,作业可能无法暂停。在这些情况下,如果您手动暂停了作业,作业会恢复为运行状态;如果作业因错误而暂停,则会进入失败状态。
继续处理
当作业恢复时,服务会按如下方式处理工作项:
- 已完成的工作:服务不会重新处理作业暂停时已完全完成的任何阶段或工作项。
- 正在进行的工作:作业暂停时正在进行的所有工作项都会从头开始重新处理。
- 失败次数:所有工作项的失败次数都会重置为零,这意味着您的作业不会再次自动暂停,直到某个工作项又失败了四次。
启用“失败时暂停”
如需为作业启用“失败时暂停”功能,请在运行作业时使用 pause_on_failure Dataflow 服务选项。
Java
--dataflowServiceOptions=pause_on_failure
Python
--dataflow_service_options=pause_on_failure
Go
--dataflow_service_options=pause_on_failure
指定暂停时长上限
默认情况下,您的作业将保持暂停状态,最长为 7 天 (7d)。您可以手动将此最长暂停时长配置为介于 1 小时 (1h) 和 7 天 (7d) 之间。
仅支持 d(天)和 h(小时)。一天定义为 24 小时。
由于夏令时等因素,这可能与日历日的时长不一致。
如果暂停时长超过上限,您的作业将在下一小时内被取消。作业取消后,您将无法恢复该作业。
例如,以下示例将最长暂停时长设置为 1 天:
Java
--dataflowServiceOptions=pause_on_failure=pause_duration:1d
Python
--dataflow_service_options=pause_on_failure=pause_duration:1d
Go
--dataflow_service_options=pause_on_failure=pause_duration:1d
手动暂停 Dataflow 作业
如需手动暂停作业,请执行以下步骤。
控制台
gcloud
如需暂停 Dataflow 作业,您可以使用 Cloud Shell 中的 gcloud dataflow
jobs 命令或随 gcloud CLI 安装的本地终端。
打开 shell。
列出正在运行的 Dataflow 作业的作业 ID,然后记下要暂停的作业的作业 ID:
gcloud dataflow jobs list如果您未设置
--region标志,则会显示所有可用区域中的 Dataflow 作业。执行以下操作:
gcloud dataflow jobs pause JOB_ID --region=REGION将 JOB_ID 替换为您记下的作业 ID,并将 REGION 替换为作业区域。
API
如需使用 Dataflow REST API 暂停作业,请使用 projects.locations.jobs.update 端点,并传递以下请求正文:
{
"requestedState": "JOB_STATE_PAUSING"
}
重要提示:请勿意外地将 JOB_STATE_PAUSED 作为 requestedState 传递。
取消正在暂停或已暂停的 Dataflow 作业
您可以像往常一样取消正在暂停或已暂停的 Dataflow 作业。取消作业后,您无需再支付相关费用,但无法再恢复该作业。
暂停的作业会在最长暂停时长到期后自动取消。
恢复 Dataflow 作业
如需手动恢复已暂停的作业,请按以下步骤操作:
控制台
转到 Dataflow 作业页面。
点击要恢复的作业。
如需恢复作业,作业状态必须为已暂停(而非正在暂停)。
在作业详情页面上,点击继续。
gcloud
如需恢复 Dataflow 作业,您可以使用 Cloud Shell 中的 gcloud dataflow
jobs 命令或随 gcloud CLI 安装的本地终端。
打开 shell。
列出已暂停的 Dataflow 作业的作业 ID,然后记下要恢复的作业的作业 ID:
gcloud dataflow jobs list如果您未设置
--region标志,则会显示所有可用区域中的 Dataflow 作业。执行以下操作:
gcloud dataflow jobs resume JOB_ID --region=REGION将 JOB_ID 替换为作业 ID,将 REGION 替换为作业区域。
API
如需使用 Dataflow REST API 恢复作业,请使用 projects.locations.jobs.update 端点,并传递以下请求正文:
{
"requestedState": "JOB_STATE_RUNNING"
}
后续步骤
- 了解如何停止正在运行的流水线。
- 了解适用于批处理作业的 Dataflow Shuffle,这是使用此功能的前提条件。
- 请参阅排查流水线问题指南来解决错误。
- 了解如何排查批量作业缓慢或卡住的问题。