如何解决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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。