暂停 Dataflow 作业

使用“失败时暂停”服务选项来保留 Dataflow 批处理作业的状态。借助此功能,您可以暂停作业执行、解决流水线外部的问题,并在不丢失已完成工作的情况下恢复处理。使用此功能暂停作业后,您无法更改流水线代码或工作器虚拟机配置(例如机器类型)。

启用此功能后,您可以更好地管理资源费用,并在临时中断或配额受限期间提高作业可靠性。您还可以通过在启用“失败时暂停”功能时配置最长暂停时长,进一步掌控流水线生命周期。您还可以手动暂停或恢复启用了 pause-on-failure 标志的流水线。

暂停失败的好处

借助“失败时暂停”服务选项,您可以在中断期间保留批量作业进度,从而减少总计算时间和资源支出。

  • 检查点保留:作业失败时,您可以从上次记录的检查点继续执行,而不是从头开始。这样一来,您就不需要重新处理已完成的数据块,这意味着您无需为已成功完成的工作付费。
  • 减少外部依赖项:保护流水线免受暂时性问题的影响,例如外部服务中的临时中断或速率限制。暂停作业可让您有机会在恢复执行之前解决根本原因,而不会丢失已完成的工作。
  • 处理不确定的故障:对于容易发生间歇性或不确定故障的工作负载,此选项可让您在每次连续尝试时确保增量进度,从而防止作业完全失败。
  • 管理资源和配额:暂停低优先级的批处理作业,以暂时释放配额或将 GPU 或 TPU 等高价值资源重新分配给紧急工作负载(例如机器学习模型训练或推理),而不会丢失其基准进度。

支持和限制

暂停作业(手动或因失败而暂停)有以下要求和限制:

失败时暂停作业的行为

启用“失败时暂停”功能后,作业会在工作项失败 4 次后自动暂停。您可以在日志中找到这些失败,它们以包含 Error message from worker 的作业消息和包含 Completed work item ITEM_NUMBER UNSUCCESSFULLY 的工作器消息的形式呈现。其他类型的失败(例如缺货和配额错误)不会触发自动暂停。相反,这些故障会导致作业正常失败。启用“失败时暂停”功能后,您还可以手动暂停作业。

作业状态转换

当 Dataflow 作业暂停时,它会经历以下状态:

  1. 暂停:一种中间状态,作业会停止处理、删除工作器虚拟机并归档后端状态。在服务完成删除虚拟机之前,您仍需为这些虚拟机付费。
  2. 已暂停:作业已完全停止。目前,您只需为已归档的 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 作业

如需手动暂停作业,请执行以下步骤。

控制台

  1. 转到 Dataflow 作业页面。

    转到作业

  2. 点击要暂停的作业。

    如需暂停作业,作业状态必须为正在运行

  3. 在作业详情页面上,点击暂停

    如果您没有看到“暂停”按钮,则表示您的作业无法暂停,因为存在“失败时暂停”限制

gcloud

如需暂停 Dataflow 作业,您可以使用 Cloud Shell 中的 gcloud dataflow jobs 命令或随 gcloud CLI 安装的本地终端。

  1. 打开 shell。

  2. 列出正在运行的 Dataflow 作业的作业 ID,然后记下要暂停的作业的作业 ID:

    gcloud dataflow jobs list
    

    如果您未设置 --region 标志,则会显示所有可用区域中的 Dataflow 作业。

  3. 执行以下操作:

    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 作业

如需手动恢复已暂停的作业,请按以下步骤操作:

控制台

  1. 转到 Dataflow 作业页面。

    转到作业

  2. 点击要恢复的作业。

    如需恢复作业,作业状态必须为已暂停(而非正在暂停)。

  3. 在作业详情页面上,点击继续

gcloud

如需恢复 Dataflow 作业,您可以使用 Cloud Shell 中的 gcloud dataflow jobs 命令或随 gcloud CLI 安装的本地终端。

  1. 打开 shell。

  2. 列出已暂停的 Dataflow 作业的作业 ID,然后记下要恢复的作业的作业 ID:

    gcloud dataflow jobs list
    

    如果您未设置 --region 标志,则会显示所有可用区域中的 Dataflow 作业。

  3. 执行以下操作:

    gcloud dataflow jobs resume JOB_ID --region=REGION
    

    JOB_ID 替换为作业 ID,将 REGION 替换为作业区域。

API

如需使用 Dataflow REST API 恢复作业,请使用 projects.locations.jobs.update 端点,并传递以下请求正文:

{
  "requestedState": "JOB_STATE_RUNNING"
}

后续步骤