有人可以澄清使用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
答案 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.py
与setup.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。