的生命周期如下:DoFn
Setup
- 重复处理捆绑包:
StartBundle
- 重复
ProcessElement
FinishBundle
Teardown
也就是说,DoFn的一个实例可以处理许多(零个或多个)捆绑包,并且在一个捆绑包中,它处理许多(零个或多个)元素。
两者都是可选的 - 可以在不使用它们的情况下实现任何,并且仅在 中执行工作,但是效率低下。这两种方法都允许优化:Setup
Teardown
StartBundle
FinishBundle
DoFn
ProcessElement
- 通常,人们希望在元素之间进行批处理工作,例如,不是为每个元素执行RPC,而是为N个元素的批次执行RPC。/ 告诉您批处理允许的边界是什么:基本上,您不允许进行批处理 - 必须强制刷新批处理(并且必须初始化/重置批处理)。这是我所知道的这些方法的唯一常见用法,但是如果您对更一般或更严格的解释感兴趣 - 捆绑包是容错的单位,并且运行器假设在返回时,您已经完全执行了与此捆绑包中看到的所有元素相关的所有工作(输出元素或执行副作用);工作不得在捆绑包之间“泄漏”。
StartBundle
FinishBundle
FinishBundle
FinishBundle
StartBundle
FinishBundle
- 通常,人们希望管理长期资源,例如网络连接。您可以在 / 中执行此操作,但是,与挂起的副作用或输出不同,此类资源在捆绑包之间持久存在是可以的。这就是目的。
StartBundle
FinishBundle
Setup
Teardown
- 通常还需要对一个进行昂贵的初始化,例如解析配置文件等。这也最好在 中完成。
DoFn
Setup
更简洁:
- 在 / 中管理资源和成本高昂的初始化。
Setup
Teardown
- 管理 / 中的工作批处理。
StartBundle
FinishBundle
(在捆绑包方法中管理资源效率低下;在设置/拆解中管理批处理显然是不正确的,并且会导致数据丢失)
DoFn 文档最近进行了更新,以使其更加清晰。