这两个注释之间有什么区别?
DoFn.Setup
用于准备要处理元素束的实例的方法的注释。
使用单词“bundle”,参数为零。
DoFn.StartBundle
用于准备用于处理一批元素的实例的方法的注释。
使用单词“batch”,接受零个或一个参数( StartBundleContext
,一种访问PipelineOptions
的方法)。
我想做什么
我需要在DoFn实例中初始化一个库,然后对“批处理”或“ bundle 销售”中的每个元素使用该库。我通常不会用这两个词来分开头发,但是在管道中,可能会有一些区别吗?
最佳答案
DoFn
的生命周期如下:
Setup
StartBundle
ProcessElement
FinishBundle
Teardown
即DoFn的一个实例可以处理许多(零个或多个)bundle,在一个 bundle 中,它可以处理许多(零个或多个)bundle。
Setup
/Teardown
和StartBundle
/FinishBundle
都是可选的-无需使用它们就可以实现任何DoFn
,并且仅在ProcessElement
中完成工作,但是这样做效率低下。两种方法都允许优化:StartBundle
/FinishBundle
告诉您批处理的允许边界是什么:基本上,您不允许跨FinishBundle
进行批处理-FinishBundle
必须强制刷新您的批处理(并且StartBundle
必须初始化/重置批处理)。这是我所知道的这些方法的唯一常用用法,但是如果您对更一般或更严格的解释感兴趣- bundle 包是容错的单位,并且运行程序假定FinishBundle
返回时,您已经完全完成了与 bundle 软件中所有元素相关的所有工作(输出元素或执行副作用);工作一定不能在 bundle 包之间“泄漏”。 StartBundle
/FinishBundle
中执行此操作,但与待处理的副作用或输出不同,此类资源可以在束之间持久存在。这就是Setup
和Teardown
的用途。 DoFn
进行昂贵的初始化,例如解析配置文件等。这也最好在Setup
中完成。 更简洁地说:
Setup
/Teardown
中管理资源和昂贵的初始化。 StartBundle
/FinishBundle
管理工作的批处理。 (以 bundle 方式管理资源效率低下;在设置/拆卸中管理批处理显然是不正确的,并且会导致数据丢失)
DoFn文档的名称为recently updated,以使其更加清晰。