Dataflow 快照保存了流处理流水线的状态,让您可以在不丢失状态的情况下启动 Dataflow 作业的新版本。快照对于备份和恢复、对流式流水线的测试和回滚更新以及其他类似场景很有用。
您可以创建任何正在运行的流处理作业的 Dataflow 快照。请注意,您通过快照创建的任何新作业都使用 Streaming Engine。您还可以使用 Dataflow 快照将现有流水线迁移到效率更高的、可扩缩的 Streaming Engine 中,并且将停机时间缩至最短。
本指南介绍如何创建快照、管理快照以及通过快照创建作业。
准备工作
- 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.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Dataflow, Compute Engine, Cloud Logging, Cloud Storage, Google Cloud Storage JSON, BigQuery, Cloud Pub/Sub, Cloud Datastore, and Cloud Resource Manager APIs.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Dataflow, Compute Engine, Cloud Logging, Cloud Storage, Google Cloud Storage JSON, BigQuery, Cloud Pub/Sub, Cloud Datastore, and Cloud Resource Manager APIs.
创建快照
控制台
gcloud
创建快照:
gcloud dataflow snapshots create \ --job-id=JOB_ID \ --snapshot-ttl=DURATION \ --snapshot-sources=true \ --region=REGION
请替换以下内容:
JOB_ID
:您的流式作业 IDDURATION
:快照到期之前的时长(以天为单位);快照到期后,您无法通过快照创建更多作业。snapshot-ttl
标志是可选的,因此如果未指定,快照将在 7 天后过期。请按以下格式指定值:5d
。可指定的最长时长为 30 天 (30d
)。REGION
:作业运行的区域
snapshot-sources
标志指定是否随 Dataflow 快照一起为 Pub/Sub 源截取快照。如果为 true
,则系统会自动为 Pub/Sub 源截取快照,并且输出响应中会显示 Pub/Sub 快照 ID。运行 create
命令后,通过运行 list
或 describe
命令检查快照状态。
创建 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 快照不会自动删除关联的 Pub/Sub 快照。
控制台
- 在 Google Cloud 控制台中,转到 Dataflow 快照页面。
- 选择快照,然后点击删除。
- 在删除快照对话框中,点击删除进行确认。
gcloud
删除快照:
gcloud dataflow snapshots delete SNAPSHOT_ID \ --region=REGION
请替换以下内容:
SNAPSHOT_ID
:您的快照 IDREGION
:您的快照所在的区域
如需了解详情,请参阅 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_CLASS
或MODULE
:对于 Java 流水线,这是包含流水线代码的主类的位置。对于 Python 流水线,这是包含流水线代码的模块的位置。例如,使用 Wordcount 示例时,值为org.apache.beam.examples.WordCount
。PROJECT_ID
:您的 Google Cloud 项目 IDSTORAGE_BUCKET
:用于临时作业资产和最终输出的 Cloud Storage 存储桶SNAPSHOT_ID
:要通过其创建新作业的快照的 IDREGION
:要运行新 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_CLASS
或MODULE
:对于 Java 流水线,这是包含流水线代码的主类的位置。对于 Python 流水线,这是包含流水线代码的模块的位置。例如,使用 Wordcount 示例时,值为org.apache.beam.examples.WordCount
。PROJECT_ID
:您的 Google Cloud 项目 IDSTORAGE_BUCKET
:用于临时作业资产和最终输出的 Cloud Storage 存储桶SNAPSHOT_ID
:要通过其创建新作业的快照的 IDREGION
:要运行新 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 问题排查指南。