DoFn.Setup 和 DoFn.StartBundle 之间有什么区别?

2022-09-02 19:27:05

这两个注释之间有什么区别?

DoFn.Setup 注释,用于准备用于处理元素束的实例的方法。

使用单词“bundle”,采用零参数。

DoFn.StartBundle Annotation,用于准备用于处理一批元素的实例的方法。

使用单词“batch”,采用零个或一个参数(StartBundleContext,一种访问方式)。PipelineOptions

我想做什么

我需要在DoFn实例中初始化一个库,然后为“批处理”或“捆绑包”中的每个元素使用该库。我通常不会用这两个词来分头,但是在管道中,可能会有一些区别?


答案 1

的生命周期如下:DoFn

  • Setup
  • 重复处理捆绑包:
    • StartBundle
    • 重复ProcessElement
    • FinishBundle
  • Teardown

也就是说,DoFn的一个实例可以处理许多(零个或多个)捆绑包,并且在一个捆绑包中,它处理许多(零个或多个)元素。

两者都是可选的 - 可以在不使用它们的情况下实现任何,并且仅在 中执行工作,但是效率低下。这两种方法都允许优化:SetupTeardownStartBundleFinishBundleDoFnProcessElement

  • 通常,人们希望在元素之间进行批处理工作,例如,不是为每个元素执行RPC,而是为N个元素的批次执行RPC。/ 告诉您批处理允许的边界是什么:基本上,您不允许进行批处理 - 必须强制刷新批处理(并且必须初始化/重置批处理)。这是我所知道的这些方法的唯一常见用法,但是如果您对更一般或更严格的解释感兴趣 - 捆绑包是容错的单位,并且运行器假设在返回时,您已经完全执行了与此捆绑包中看到的所有元素相关的所有工作(输出元素或执行副作用);工作不得在捆绑包之间“泄漏”。StartBundleFinishBundleFinishBundleFinishBundleStartBundleFinishBundle
  • 通常,人们希望管理长期资源,例如网络连接。您可以在 / 中执行此操作,但是,与挂起的副作用或输出不同,此类资源在捆绑包之间持久存在是可以的。这就是目的。StartBundleFinishBundleSetupTeardown
  • 通常还需要对一个进行昂贵的初始化,例如解析配置文件等。这也最好在 中完成。DoFnSetup

更简洁:

  • 在 / 中管理资源和成本高昂的初始化。SetupTeardown
  • 管理 / 中的工作批处理。StartBundleFinishBundle

(在捆绑包方法中管理资源效率低下;在设置/拆解中管理批处理显然是不正确的,并且会导致数据丢失)

DoFn 文档最近进行了更新,以使其更加清晰。


答案 2

推荐