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

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

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

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

使用单词“batch”,接受零个或一个参数( StartBundleContext ,一种访问PipelineOptions的方法)。

我想做什么

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

最佳答案

DoFn的生命周期如下:

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

  • 即DoFn的一个实例可以处理许多(零个或多个)bundle,在一个 bundle 中,它可以处理许多(零个或多个)bundle。
    Setup/TeardownStartBundle/FinishBundle都是可选的-无需使用它们就可以实现任何DoFn,并且仅在ProcessElement中完成工作,但是这样做效率低下。两种方法都允许优化:
  • 通常,您希望在元素之间进行批处理工作,例如代替对每个元素执行RPC,而是对N个元素进行批处理。 StartBundle/FinishBundle告诉您批处理的允许边界是什么:基本上,您不允许跨FinishBundle进行批处理-FinishBundle必须强制刷新您的批处理(并且StartBundle必须初始化/重置批处理)。这是我所知道的这些方法的唯一常用用法,但是如果您对更一般或更严格的解释感兴趣- bundle 包是容错的单位,并且运行程序假定FinishBundle返回时,您已经完全完成了与 bundle 软件中所有元素相关的所有工作(输出元素或执行副作用);工作一定不能在 bundle 包之间“泄漏”。
  • 通常,您想要管理长期存在的资源,例如网络连接。您可以在StartBundle/FinishBundle中执行此操作,但与待处理的副作用或输出不同,此类资源可以在束之间持久存在。这就是SetupTeardown的用途。
  • 通常,人们也想对DoFn进行昂贵的初始化,例如解析配置文件等。这也最好在Setup中完成。

  • 更简洁地说:
  • Setup/Teardown中管理资源和昂贵的初始化。
  • StartBundle/FinishBundle管理工作的批处理。

  • (以 bundle 方式管理资源效率低下;在设置/拆卸中管理批处理显然是不正确的,并且会导致数据丢失)

    DoFn文档的名称为recently updated,以使其更加清晰。

    10-06 14:39