gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 23:00:05 25 4
gpt4 key购买 nike

这两个注释有什么区别?

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

使用单词“bundle”,接受零个参数。

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

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

我正在尝试做什么

我需要在 DoFn 实例中初始化一个库,然后将该库用于“批处理”或“ bundle ”中的每个元素。我通常不会对这两个词吹毛求疵,但是在管道中,可能会有一些区别?

最佳答案

DoFn 的生命周期如下:

  • 设置
  • 重复处理包:
    • StartBundle
    • 重复ProcessElement
    • 完成包
  • 拆解

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

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

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

更简洁地说:

  • Setup/Teardown中管理资源和昂贵的初始化。
  • StartBundle/FinishBundle 中管理工作批处理。

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

DoFn 文档为 recently updated让这一点更清楚。

关于java - DoFn.Setup 和 DoFn.StartBundle 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45985753/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com