Google cloud dataflow Beam python sdk-保存主会话-DoFn导入-最佳实践是什么?

Google cloud dataflow Beam python sdk-保存主会话-DoFn导入-最佳实践是什么?,google-cloud-dataflow,apache-beam,Google Cloud Dataflow,Apache Beam,我有一个关于save_main_会话和最佳实践的问题,请告诉我是否有一个文档涵盖了这个问题。因此,当save_main_session设置为False时,如果process方法中的DoFn使用标准lib copy module、Beam的FileSystems API或自定义模块,如果我在定义DoFn的文件的模块级顶部导入这些模块,这将在数据流服务中失败,并出现一个错误,该错误表示从process方法中找不到copy etc模块,这一切都是有意义的,我可以通过以下方式解决此问题: 在进程方法内导

我有一个关于save_main_会话和最佳实践的问题,请告诉我是否有一个文档涵盖了这个问题。因此,当save_main_session设置为False时,如果process方法中的DoFn使用标准lib copy module、Beam的FileSystems API或自定义模块,如果我在定义DoFn的文件的模块级顶部导入这些模块,这将在数据流服务中失败,并出现一个错误,该错误表示从process方法中找不到copy etc模块,这一切都是有意义的,我可以通过以下方式解决此问题:

在进程方法内导入副本 将副本引用/对象保存为DoFn实例中的字段/提供程序/etc 将save_main_会话设置为True 我不想将save_main_session设置为True,因为它捕获了整个主会话,我在其中有一堆不可序列化的对象,并且总体上发现save_main_session很臭。第一个选项也有点难闻,并不总是有效-导入是缓存的,所以性能方面应该是OK的-但它不适用于我的自定义模块afaiu,除非我明确地安装/发送它们给工作人员。最后,第二个是有点老套的-围绕梁框架工作

我主要倾向于第二个选项,但是我觉得不能仅仅使用全局导入和解决方法,比如添加和使用实例字段

解决此问题的最佳做法是什么?我知道这些例子建议将save_main_session设置为True,但这同样会产生后果,而且只是一种气味。有更好的选项吗?

DoFn类附带了一个setup方法,每个DoFn实例调用一次。您可以重写此方法,并在那里执行导入


值得注意的是,Beam的Python 2.13.0版中提供了此方法。如果您使用的是早期版本,您可以覆盖DoFn中的start_bundle以在那里执行导入。

这并不能解决在整个DoFn内容/funs/etc中全局公开这些导入的问题,对吗?因此,这并不是对这个问题的真正回答,对吗?我遗漏了什么吗?您也可以通过在递归/递归模式下使用dill来解决这个问题,请参见我的评论: