在 GCP Dataflow/Apache Beam Python SDK 中,DoFn.process 有时间限制吗?

coz*_*zos 0 python timeout google-cloud-dataflow apache-beam apache-beam-internals

在 GCP Dataflow 上运行的 Apache Beam Python SDK 中,我需要DoFn.process很长时间。我的 DoFn 花了很长时间,原因并不那么重要 - 由于我无法控制的要求,我必须接受它们。但如果您必须知道的话,它对外部服务进行网络调用需要相当长的时间(几秒钟),并且它正在处理先前的多个元素GroupByKey- 导致DoFn.process调用需要几分钟的时间。

无论如何,我的问题是:通话的运行时间长度是否有时间限制DoFn.process?我这么问是因为我看到的日志如下所示:

WARNING 2023-01-03T13:12:12.679957Z ReportProgress() took long: 1m49.15726646s
WARNING 2023-01-03T13:12:14.474585Z ReportProgress() took long: 1m7.166061638s
WARNING 2023-01-03T13:12:14.864634Z ReportProgress() took long: 1m58.479671042s
WARNING 2023-01-03T13:12:16.967743Z ReportProgress() took long: 1m40.379289919s
2023-01-03 08:16:47.888 EST Error message from worker: SDK harness sdk-0-6 disconnected.
2023-01-03 08:21:25.826 EST Error message from worker: SDK harness sdk-0-2 disconnected.
2023-01-03 08:21:36.011 EST Error message from worker: SDK harness sdk-0-4 disconnected.
Run Code Online (Sandbox Code Playgroud)

在我看来,Apache Beam Fn API 进度报告机制认为我的DoFn.process函数卡住了,没有取得任何进展,并最终终止“无响应”的 SDK Harness。发生这种情况是因为我的DoFn.process处理速度太低而无法处理单个元素吗?如果是这样,我如何向数据流工作引擎报告进度以让它知道我的DoFn.process仍然存在?

Sze*_*eri 5

DoFn.process 调用的运行时长度没有时间限制。不过,还有一个相关的事情。在 Dataflow 上运行的管道会定期报告进度,如果此进度报告长时间失败,Dataflow 服务将假定相关工作线程失败并取消分配给这些工作线程的工作。

在Python 中,如果由于某种原因未调度进度报告线程(例如长时间持有GIL,或者某些消耗所有CPU 的事情),则可能会发生这种情况。有关详细信息,请参阅https://cloud.google.com/dataflow/docs/guides/common-errors(以“在 Python 管道中,当工作线程使用过多 CPU 时可能会发生此错误。”开头的段落)。