python Dataflow DoFn生命周期中多长时间的光束setup刷新?

问题描述

我有一个流传输管道,我需要从BigQuery查询作为管道转换的参考。由于BigQuery表仅在2周内发生更改,因此我将查询缓存放入setup()而不是start_bundle()中。从观察日志中,我看到start_bundle()将在DoFn生命周期中刷新其值(约50-100个元素),但是setup()将永远不会刷新。有什么办法可以解决这个问题?

解决方法

虽然您没有提供代码,但我会根据您的解释回答您的问题。

首先,关于DoFn.start_bundle(),将为每个捆绑软件调用此函数,DataFlow可以根据执行期间收集的指标来决定这些捆绑软件的大小。

第二DoFn.setup()每个工作人员被调用一次。如果重新启动工作程序,则只会再次调用它。此外,作为比较,DoFn.processElement()每个元素仅调用一次。

由于您需要每周刷新两次查询,因此对于使用SideInput"Slowly-changing lookup cache"来说,这是一个完美的选择。当您有一张随时间变化的查询表时,可以使用这种方法。因此,您需要更新查找结果。但是,您可以使用流模式,而不是在批处理模式下使用单个查询。它允许您基于GlobalWindow更新查询结果(在您的情况下为查询结果)。然后,有了这一边的输入,您可以在主流PCollection中使用它。

注意::我必须指出,作为局限性,sideInputs无法正确处理大量数据(许多Gbs或Tb)。此外,explanation非常有用。

,

以上答案是好的。或者,您可以调用start_bundle()中的方法来返回结果的缓存版本,只要该结果足够新鲜即可,否则从BQ进行完整读取。参见例如Python in-memory cache with time to live

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...