我对save_main_session
和最佳做法有疑问,请让我知道是否有文档涵盖此问题。因此,在save_main_session
设置为False
的情况下,如果我在DoFn
方法中的process
使用例如标准lib copy
模块,Beam的FileSystems
API或我的自定义模块,如果我在定义了DoFn
的模块级别(文件顶部)导入那些模块,则这将在Dataflow服务中失败,并显示一条错误,提示copy
(等)模块不能从process
方法中找到(这都很有意义),我可以通过以下任一方法来解决此问题:
copy
copy
引用/对象“保存”为DoFn
实例中的字段/提供者/等save_main_session
设置为True
我不想将save_main_session
设置为True
,因为afaiu它捕获了整个主会话,并且我有一堆无法序列化的对象,总体上发现save_main_session
臭又黑。第一个选项也很臭,而且并不总是有效-导入文件已被缓存,因此性能应该可以-但它不适用于我的自定义模块afaiu(除非我明确将其安装/发送给工作人员)。最后2nd有点怪-在Beam框架周围工作。
我主要倾向于使用第二个选项,但是感觉不对,无法仅使用全局导入并解决该问题,即添加和使用实例字段。
此问题的最佳实践是什么?我知道这些示例建议将save_main_session
设置为True
,但这又会带来后果,并且只会产生气味。有更好的选择吗?
答案 0 :(得分:-1)
DoFn
类带有setup
方法,每个DoFn
实例调用一次。您可以覆盖此方法,然后在其中执行导入。
请注意,此方法在Beam的Python版本2.13.0中可用。如果您使用的是较早的版本,则可以在start_bundle
中覆盖DoFn
,以在那里进行导入。