使用 Dataflow 快照

Dataflow 快照保存了流处理流水线的状态,让您可以在不丢失状态的情况下启动 Dataflow 作业的新版本。快照对于备份和恢复、对流式流水线的测试和回滚更新以及其他类似场景很有用。

您可以创建任何正在运行的流处理作业的 Dataflow 快照。请注意,您通过快照创建的任何新作业都使用 Streaming Engine。您还可以使用 Dataflow 快照将现有流水线迁移到效率更高的、可扩缩的 Streaming Engine 中,并且将停机时间缩至最短。

本指南介绍如何创建快照、管理快照以及通过快照创建作业。

准备工作

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the Dataflow, Compute Engine, Cloud Logging, Cloud Storage, Google Cloud Storage JSON, BigQuery, Cloud Pub/Sub, Cloud Datastore, and Cloud Resource Manager APIs.

    Enable the APIs

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  6. Make sure that billing is enabled for your Google Cloud project.

  7. Enable the Dataflow, Compute Engine, Cloud Logging, Cloud Storage, Google Cloud Storage JSON, BigQuery, Cloud Pub/Sub, Cloud Datastore, and Cloud Resource Manager APIs.

    Enable the APIs

创建快照

控制台

  1. 在 Google Cloud 控制台中,转到 Dataflow 作业页面。

    打开“作业”

    此时系统将显示 Dataflow 作业及其状态的列表。 如果没有看到任何流处理作业,则需要运行新的流处理作业。如需查看流处理作业的示例,请参阅使用模板快速入门

  2. 选择一个作业。
  3. 作业详情页面的菜单栏中,点击创建快照
  4. 创建快照对话框中,选择以下选项之一:
    • 不包含数据源:选择此选项将仅创建 Dataflow 作业状态的快照。
    • 包含数据源:选择此选项将创建 Dataflow 作业状态以及 Pub/Sub 来源的快照。
  5. 点击创建

gcloud

创建快照:

gcloud dataflow snapshots create \
    --job-id=JOB_ID \
    --snapshot-ttl=DURATION \
    --snapshot-sources=true \
    --region=REGION

请替换以下内容:

  • JOB_ID:您的流式作业 ID
  • DURATION:快照到期之前的时长(以天为单位);快照到期后,您无法通过快照创建更多作业。snapshot-ttl 标志是可选的,因此如果未指定,快照将在 7 天后过期。请按以下格式指定值:5d。可指定的最长时长为 30 天 (30d)。
  • REGION:作业运行的区域

snapshot-sources 标志指定是否随 Dataflow 快照一起为 Pub/Sub 源截取快照。如果为 true,则系统会自动为 Pub/Sub 源截取快照,并且输出响应中会显示 Pub/Sub 快照 ID。运行 create 命令后,通过运行 listdescribe 命令检查快照状态。

创建 Dataflow 快照时,以下内容适用:

  • Dataflow 快照会产生磁盘使用费
  • 系统会在与作业相同的区域中创建快照。
  • 如果作业工作器的位置与作业的区域不同,快照创建将失败。请参阅 Dataflow 区域指南。
  • 只有在作业于 2021 年 2 月 1 日之后启动或更新时,才能截取非 Streaming Engine 作业的快照。
  • 使用 Dataflow 快照创建的 Pub/Sub 快照由 Pub/Sub 服务管理并且会产生费用
  • 自 Pub/Sub 快照创建之日起,它在最多 7 天内有效。其确切的有效期由创建时源订阅中的积压情况决定。具体而言,Pub/Sub 快照的有效期为 7 days - (age of oldest unacked message in the subscription)。例如,假设某个订阅最早的未确认消息为 3 天前。如果根据此订阅创建 Pub/Sub 快照,只要快照存在,它将始终捕获此 3 天前的积压消息,那么此快照将在 4 天后过期。请参阅 Pub/Sub 快照参考
  • 在快照操作过程中,Dataflow 作业会在快照准备就绪后暂停和恢复。所需时间取决于流水线状态的大小。例如,为 Streaming Engine 作业创建快照所需的时间通常比非 Streaming Engine 作业短。
  • 您可以在快照进行时取消作业,然后取消快照。
  • 无法在快照进行时更新排空作业。必须等到从快照过程恢复作业后,才能更新或排空作业。

使用快照页面

创建快照后,您可以使用 Google Cloud 控制台中的快照页面来查看和管理项目的快照。

点击快照会打开快照详情页面。您可以查看有关快照的其他元数据,以及指向源作业和任何 Pub/Sub 快照的链接。

Dataflow 快照详情页面,在其中可以获取有关快照的详细信息。

删除快照

通过删除快照,您可以停止快照过程并恢复作业。此外,删除 Dataflow 快照不会自动删除关联的 Pub/Sub 快照。

控制台

  1. 在 Google Cloud 控制台中,转到 Dataflow 快照页面。

    转到“快照”

  2. 选择快照,然后点击删除
  3. 删除快照对话框中,点击删除进行确认。

gcloud

删除快照:

gcloud dataflow snapshots delete SNAPSHOT_ID \
    --region=REGION

请替换以下内容:

  • SNAPSHOT_ID:您的快照 ID
  • REGION:您的快照所在的区域

如需了解详情,请参阅 delete 命令参考。

从快照创建作业

创建快照后,可以通过从该快照创建新作业来恢复 Dataflow 作业的状态。

Java

如需从快照创建新作业,请同时使用 --createFromSnapshot--enableStreamingEngine 标志。

  • 在您的 shell 或终端中,通过快照创建新作业。例如:
    mvn -Pdataflow-runner compile exec:java \
        -Dexec.mainClass=MAIN_CLASS \
        -Dexec.args="--project=PROJECT_ID \
        --stagingLocation=gs://STORAGE_BUCKET/staging/ \
        --inputFile=gs://apache-beam-samples/shakespeare/* \
        --output=gs://STORAGE_BUCKET/output \
        --runner=DataflowRunner \
        --enableStreamingEngine \
        --createFromSnapshot=SNAPSHOT_ID \
        --region=REGION"

    请替换以下内容:

    • MAIN_CLASSMODULE:对于 Java 流水线,这是包含流水线代码的主类的位置。对于 Python 流水线,这是包含流水线代码的模块的位置。例如,使用 Wordcount 示例时,值为 org.apache.beam.examples.WordCount
    • PROJECT_ID:您的 Google Cloud 项目 ID
    • STORAGE_BUCKET:用于临时作业资产和最终输出的 Cloud Storage 存储桶
    • SNAPSHOT_ID:要通过其创建新作业的快照的 ID
    • REGION:要运行新 Dataflow 作业的位置

Python

Dataflow 快照需要 Python 版 Apache Beam SDK 2.29.0 版或更高版本。

如需从快照创建新作业,请同时使用 --createFromSnapshot--enableStreamingEngine 标志。

  • 在您的 shell 或终端中,通过快照创建新作业。例如:
    python -m MODULE \
        --project PROJECT_ID \
        --temp_location gs://STORAGE_BUCKET/tmp/ \
        --input gs://apache-beam-samples/shakespeare/* \
        --output gs://STORAGE_BUCKET/output \
        --runner DataflowRunner \
        --enable_streaming_engine \
        --create_from_snapshot=SNAPSHOT_ID \
        --region REGION \
        --streaming

    请替换以下内容:

    • MAIN_CLASSMODULE:对于 Java 流水线,这是包含流水线代码的主类的位置。对于 Python 流水线,这是包含流水线代码的模块的位置。例如,使用 Wordcount 示例时,值为 org.apache.beam.examples.WordCount
    • PROJECT_ID:您的 Google Cloud 项目 ID
    • STORAGE_BUCKET:用于临时作业资产和最终输出的 Cloud Storage 存储桶
    • SNAPSHOT_ID:要通过其创建新作业的快照的 ID
    • REGION:要运行新 Dataflow 作业的位置

从 Dataflow 快照创建作业时,以下内容适用:

  • 从快照创建的作业必须在存储快照的同一区域运行。
  • 如果 Dataflow 快照包含 Pub/Sub 源的快照,则从 Dataflow 快照创建的作业会自动 seek 这些 Pub/Sub 快照作为源。从该 Dataflow 快照创建作业时,必须指定源作业使用的相同 Pub/Sub 主题。

  • 如果 Dataflow 快照不包含 Pub/Sub 源的快照,并且源作业使用 Pub/Sub 源,则您必须在通过该 Dataflow 快照创建作业时指定 Pub/Sub 主题。

  • 从快照创建的新作业仍需进行更新兼容性检查

已知限制

以下限制适用于 Dataflow 快照:

  • 无法使用模板或 Dataflow SQL 编辑器从快照创建作业。
  • 只能通过 Google Cloud CLI 设置快照到期时间范围。
  • Dataflow 快照仅支持 Pub/Sub 源快照。
  • 不支持接收器快照。例如,您无法在创建 Dataflow 快照时创建 BigQuery 快照。

问题排查

本部分介绍如何排查与 Dataflow 快照交互时出现的常见问题。

在联系支持团队之前,请确保您已排除与已知限制和以下问题排查部分相关的问题。

快照创建请求遭拒

通过 Google Cloud 控制台或 gcloud CLI 提交快照创建请求后,Dataflow 服务会执行前提条件检查,并返回任何错误消息。快照创建请求可能由于错误消息中指定的各种原因被拒绝,例如作业类型不受支持或区域不可用。

如果请求因作业太旧而遭拒,则您必须先更新作业,然后才能请求快照。

快照创建失败

由于种种原因,快照创建可能会失败。例如,源作业已取消,或者项目没有正确的权限来创建 Pub/Sub 快照。作业的 job-message 日志包含来自快照创建错误消息。如果快照创建失败,则源作业会继续。

从快照创建作业失败

通过快照创建作业时,请确保快照存在且未过期。新作业必须在 Streaming Engine 上运行。

如需了解常见的作业创建问题,请参阅 Dataflow 的问题排查指南。具体来讲,通过快照创建的新作业需要进行更新兼容性检查,其中新作业必须与截取的源作业快照兼容。

通过快照创建的作业几乎没有进展

作业的 job-message 日志包含用于作业创建的错误消息。例如,您可能会看到作业找不到 Pub/Sub 快照。在这种情况下,请验证 Pub/Sub 快照是否存在且未过期。只要快照中最早的消息超过七天,Pub/Sub 快照就会到期。 Pub/Sub 服务可能会自动移除过期的 Pub/Sub 快照。

对于通过包含 Pub/Sub 源快照的 Dataflow 快照创建的作业,新作业可能会有大量 Pub/Sub 积压消息需要处理。流式自动扩缩功能可能有助于新作业更快地清除积压消息。

在截取快照之前,快照来源作业可能已经处于运行状况不佳的状态。了解源作业运行状况不佳的原因可能有助于解决新作业的问题。如需了解常见的作业调试提示,请参阅 Dataflow 问题排查指南