使用 pause-on-failure 服务选项来保留 Dataflow 批量作业的状态。借助此功能,您可以暂停作业执行、解决流水线外部的问题,并继续处理,而不会丢失已完成的工作。使用此功能暂停作业后,您无法更改流水线代码或工作器虚拟机配置,例如机器类型。
启用此功能后,您可以在临时中断或配额限制期间更好地管理资源费用并提高作业可靠性。您还可以在启用 pause-on-failure 时配置最长暂停时长,从而进一步控制流水线生命周期。您还可以手动暂停或恢复已启用 pause-on-failure 标志的流水线。
pause-on-failure 的优势
借助 pause-on-failure 服务选项,您可以在中断期间保留批量作业进度,从而缩短总计算时间和资源支出。
- 检查点保留 :当作业失败时,您可以从上次记录的检查点恢复作业,而不是从头开始。这样可以避免重新处理已完成的数据块,这意味着您无需为重新完成已成功完成的工作付费。
- 减少外部依赖项 :保护您的流水线免受暂时性问题的影响,例如外部服务中的临时中断或速率限制。 暂停作业可让您有机会在恢复执行之前解决根本原因,而不会丢失已完成的工作。
- 处理非确定性故障 :对于容易发生间歇性或非确定性故障的工作负载,此选项可让您确保每次连续尝试的增量进度,从而防止作业完全失败。
- 管理资源和配额 :暂停优先级较低的批量作业,以暂时释放配额或将 GPU 或 TPU 等高价值资源重新分配给紧急工作负载(例如机器学习模型训练或推理),而不会丢失其基准进度。
支持和限制
暂停作业(手动或在失败时)有以下要求和限制:
- Dataflow 作业必须是批量作业。
- 作业必须使用 Dataflow Shuffle。
- 运行作业时,您必须指定
pause_on_failure服务选项。 - 作业之前不得因暂停失败。
pause-on-failure 作业行为
启用 pause-on-failure 功能后,您的作业会在工作项失败 4 次后自动暂停。这些失败会在您的日志中
标识为包含 Error message from worker 的作业消息和包含 Completed work item ITEM_NUMBER
UNSUCCESSFULLY 的工作器消息。其他类型的失败(例如缺货和配额错误)不会触发自动暂停。相反,这些失败会导致作业正常失败。启用 pause-on-failure 后,您还可以手动暂停作业。
作业状态转换
当 Dataflow 作业暂停时,它会经历以下状态:
- 正在暂停:中间状态,作业在此状态下停止处理、删除 工作器虚拟机并归档后端状态。在服务完成删除虚拟机之前,您仍需为虚拟机付费。
- 已暂停:作业已完全停止。此时,您只需为 归档的 Shuffle 数据付费。
异常行为
在以下情况下,pause-on-failure 的行为可能出乎意料:
- 如果您手动暂停即将完成的作业,该作业可能会完成而不是暂停。
- 在极少数情况下,作业可能会暂停失败。在这些情况下,如果您手动暂停作业,作业会返回到运行状态;如果作业因错误而暂停,作业会进入失败状态。
恢复处理
作业恢复后,服务会按如下方式处理工作项:
- 已完成的工作:服务不会重新处理作业暂停时已完全完成的任何阶段或工作项 。
- 正在进行的工作:作业 暂停时正在进行的任何工作项都会从头开始重新处理。
- 失败计数:所有工作项失败计数都会重置为零,这 意味着您的作业不会再次自动暂停,除非工作项再次失败 4 次。
启用 pause-on-failure
如需为作业启用 pause-on-failure,请在运行作业时使用 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 作业
如需手动暂停作业,请执行以下步骤。
控制台
转到 Dataflow 作业页面。
点击要暂停的作业。
如需暂停作业,作业的状态必须为正在运行 。
在作业详情页面上,点击暂停 。
如果您没有看到“暂停”按钮,则表示您的作业无法 暂停,因为存在 pause-on-failure 限制。
gcloud
如需暂停 Dataflow 作业,您可以使用 gcloud dataflow
jobs 命令 在
Cloud Shell 中的或随
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 作业,您可以使用 gcloud dataflow
jobs 命令 在
Cloud Shell 中或随
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,这是使用此 功能所必需的。
- 请参阅流水线 问题排查指南,以 解决错误。
- 了解如何排查批量作业缓慢或卡住的 问题。