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

时间:2017-08-31 16:02:24

标签: java apache-beam

这两个注释有什么区别?

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

使用单词" bundle",取零参数。

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

使用单词" batch",取零或一个参数(StartBundleContext,一种访问PipelineOptions的方式)。

我想做什么

我需要在DoFn实例中初始化一个库,然后将该库用于"批处理"中的每一个元素。或"捆绑"。我通常不会用这两个词分裂头发,但在管道中,可能会有一些差异?

1 个答案:

答案 0 :(得分:12)

DoFn的生命周期如下:

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

即。一个DoFn实例可以处理许多(零个或多个)包,并且在一个包中,它处理许多(零个或多个)元素。

Setup / TeardownStartBundle / FinishBundle都是可选的 - 可以在不使用它们的情况下实现任何DoFn,并且可以完成工作仅在ProcessElement中,但效率低下。两种方法都允许优化:

  • 通常人们想要在元素之间批处理,例如而不是为每个元素执行RPC,为N个元素的批次执行RPC。 StartBundle / FinishBundle告诉您批处理的允许范围:基本上,您不能批量处理FinishBundle - FinishBundle必须强制批量处理(和StartBundle必须初始化/重置批处理)。这是我所知道的这些方法的唯一常见用法,但是如果你对更一般或更严格的解释感兴趣 - 一个包是容错的单位,并且运行者假设到{{1返回后,您已完全执行与此捆绑包中所有元素关联的所有工作(输出元素或执行副作用);工作不得在捆绑之间“泄漏”。
  • 通常人们想要管理长期存在的资源,例如:网络连接。您可以在FinishBundle / StartBundle中执行此操作,但与待处理的副作用或输出不同,此类资源可以在捆绑包之间保留。这就是FinishBundleSetup的用途。
  • 同样经常有人想对Teardown执行昂贵的初始化,例如解析配置文件等。最好在DoFn
  • 中完成

更简洁:

  • Setup / Setup
  • 中管理资源和代价高昂的初始化
  • Teardown / StartBundle
  • 中管理工作批处理

(管理bundle方法中的资源效率很低;在setup / teardown中管理批处理是不正确的,会导致数据丢失)

DoFn文档为recently updated,以使其更清晰。