Google DataFlow / Python:使用__main__中的save_main_session和自定义模块导入错误

时间:2018-07-12 17:21:38

标签: python google-cloud-dataflow apache-beam

有人可以澄清使用save_main_session和在__main__中导入的自定义模块时的预期行为。我的DataFlow管道导入2个非标准模块-一个通过requirements.txt,另一个通过setup_file。除非将导入移到使用它们的函数中,否则我会不断收到导入/处理错误。示例错误如下。从文档中,我认为设置save_main_session可以帮助解决此问题,但不能解决问题(请参见下面的错误)。所以我想知道我是否错过了某些事情,或者这种行为是设计使然。将相同的导入放入函数后,效果很好。

错误:

  File "/usr/lib/python2.7/pickle.py", line 1130, in find_class
    __import__(module)
ImportError: No module named jmespath

2 个答案:

答案 0 :(得分:2)

https://cloud.google.com/dataflow/faq#how-do-i-handle-nameerrors https://beam.apache.org/documentation/sdks/python-pipeline-dependencies/

何时使用--save_main_session

  

您可以将--save_main_session管道选项设置为True。这将导致全局名称空间的状态被腌制并加载到Cloud Dataflow工作器上

最适合我的设置是将dataflow_launcher.pysetup.py放在项目根目录下。它唯一要做的就是导入管道文件并启动它。使用setup.py处理所有依赖项。这是到目前为止我发现的最好的例子。

https://github.com/apache/beam/tree/master/sdks/python/apache_beam/examples/complete/juliaset

答案 1 :(得分:0)

尤其是,如果您的DoFn具有使用super的__init__,则--save_main_session失败。参见https://issues.apache.org/jira/browse/BEAM-6158