使用 Dataflow 快照

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

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

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

准备工作

  1. 登录您的 Google Cloud 账号。如果您是 Google Cloud 新手,请创建一个账号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
  2. 在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目

    转到“项目选择器”

  3. 确保您的 Google Cloud 项目已启用结算功能

  4. 启用 Dataflow、Compute Engine、Cloud Logging、Cloud Storage、Google Cloud Storage JSON、BigQuery、Cloud Pub/Sub、Cloud Datastore 和 Cloud Resource Manager API。

    启用 API

  5. 在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目

    转到“项目选择器”

  6. 确保您的 Google Cloud 项目已启用结算功能

  7. 启用 Dataflow、Compute Engine、Cloud Logging、Cloud Storage、Google Cloud Storage JSON、BigQuery、Cloud Pub/Sub、Cloud Datastore 和 Cloud Resource Manager API。

    启用 API

创建快照

控制台

  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 问题排查指南