DoFn.Setup和DoFn.StartBundle之间有什么区别?(这是一个关于IT技术的提问标题)

26

这两个注释有什么区别?

DoFn.Setup:用于准备实例以处理元素束的方法。

使用“bundle”一词,不带参数。

DoFn.StartBundle:用于准备实例以处理批量元素的方法。

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

我的目标

我需要在DoFn实例中初始化库,然后将该库用于“batch”或“bundle”中的每个元素。通常情况下,我不会纠结这两个词的区别,但在管道中可能存在一些差异?

1个回答

60

DoFn的生命周期如下:

  • Setup
  • 重复处理bundle:
    • StartBundle
    • 重复执行ProcessElement
    • FinishBundle
  • Teardown

即一个DoFn实例可以处理许多(零个或多个)bundles,在一个bundle内,它可以处理许多(零个或多个)元素。

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

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

更简洁地说:

  • Setup/Teardown中管理资源和昂贵的初始化。
  • StartBundle/FinishBundle中管理工作的批处理。
  • 在bundles方法中管理资源是低效的;在setup / teardown中管理批处理是明显不正确的,会导致数据丢失。

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


3
非常不同:如果您在构造函数中执行某些操作,它将在构建管道的程序中运行一次,然后将DoFn序列化并发送到工作器(这意味着例如您不能在构造函数中打开连接 - 连接无法序列化和发送到工作器)。如果您在Setup中执行此操作,则每个DoFn实例上的工作器将运行一次 - 构造函数不会在工作器上调用。 - jkff
@jkff,你能否分享一些如何在Dataflow中使用Setup/Teardown的示例? - SylvesterTheKid
3
构造函数只会在主程序中构建管道时由您自己调用。之后,DoFn 在每个工作节点上进行序列化和反序列化;反序列化不会调用构造函数,它使用低级别的 JVM 机制创建该类的一个空实例并恢复字段值。但是,Beam 会在使用每个反序列化实例之前调用 Setup 方法。 - jkff
1
@jkff 总结:
  • 用户调用DoFn构造函数并创建管道。
  • Beam将DoFn序列化并发送到工作节点。
  • 当Beam反序列化DoFn时,它会调用setup方法。
  • 对于每个bundle,它都会调用startBundlefinishBundle(所有bundle元素均已处理完毕)。
  • 对于bundle中的每个元素,都会调用processElement方法。
  • tearDown方法被调用-->没有更多的bundle需要处理。
- Arnab Mukherjee
1
@Daniel One DoFn实例严格按顺序处理bundles - 它不会并行处理多个bundles,也不会并行处理一个bundle中的多个元素。请参阅https://beam.apache.org/documentation/programming-guide/#user-code-thread-compatibility - undefined
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接