DoFn.Setup
用于准备处理元素包的实例的方法的注释。
使用单词" bundle",取零参数。
DoFn.StartBundle
用于准备处理一批元素的实例的方法的注释。
使用单词" batch",取零或一个参数(StartBundleContext
,一种访问PipelineOptions
的方式)。
我需要在DoFn实例中初始化一个库,然后将该库用于"批处理"中的每一个元素。或"捆绑"。我通常不会用这两个词分裂头发,但在管道中,可能会有一些差异?
答案 0 :(得分:12)
DoFn
的生命周期如下:
Setup
StartBundle
ProcessElement
FinishBundle
Teardown
即。一个DoFn实例可以处理许多(零个或多个)包,并且在一个包中,它处理许多(零个或多个)元素。
Setup
/ Teardown
和StartBundle
/ FinishBundle
都是可选的 - 可以在不使用它们的情况下实现任何DoFn
,并且可以完成工作仅在ProcessElement
中,但效率低下。两种方法都允许优化:
StartBundle
/ FinishBundle
告诉您批处理的允许范围:基本上,您不能批量处理FinishBundle
- FinishBundle
必须强制批量处理(和StartBundle
必须初始化/重置批处理)。这是我所知道的这些方法的唯一常见用法,但是如果你对更一般或更严格的解释感兴趣 - 一个包是容错的单位,并且运行者假设到{{1返回后,您已完全执行与此捆绑包中所有元素关联的所有工作(输出元素或执行副作用);工作不得在捆绑之间“泄漏”。FinishBundle
/ StartBundle
中执行此操作,但与待处理的副作用或输出不同,此类资源可以在捆绑包之间保留。这就是FinishBundle
和Setup
的用途。Teardown
执行昂贵的初始化,例如解析配置文件等。最好在DoFn
。更简洁:
Setup
/ Setup
。Teardown
/ StartBundle
。(管理bundle方法中的资源效率很低;在setup / teardown中管理批处理是不正确的,会导致数据丢失)
DoFn文档为recently updated,以使其更清晰。