Kar*_*k N 7 python google-cloud-dataflow apache-beam
我的 Apache 光束管道实现了自定义转换和 ParDo 的 python 模块,它们进一步导入了我编写的其他模块。在本地运行器上,这工作正常,因为所有可用文件都在同一路径中。在 Dataflow 运行器的情况下,管道因模块导入错误而失败。
如何使所有数据流工作人员都可以使用自定义模块?请指教。
下面是一个例子:
ImportError: No module named DataAggregation
at find_class (/usr/lib/python2.7/pickle.py:1130)
at find_class (/usr/local/lib/python2.7/dist-packages/dill/dill.py:423)
at load_global (/usr/lib/python2.7/pickle.py:1096)
at load (/usr/lib/python2.7/pickle.py:864)
at load (/usr/local/lib/python2.7/dist-packages/dill/dill.py:266)
at loads (/usr/local/lib/python2.7/dist-packages/dill/dill.py:277)
at loads (/usr/local/lib/python2.7/dist-packages/apache_beam/internal/pickler.py:232)
at apache_beam.runners.worker.operations.PGBKCVOperation.__init__ (operations.py:508)
at apache_beam.runners.worker.operations.create_pgbk_op (operations.py:452)
at apache_beam.runners.worker.operations.create_operation (operations.py:613)
at create_operation (/usr/local/lib/python2.7/dist-packages/dataflow_worker/executor.py:104)
at execute (/usr/local/lib/python2.7/dist-packages/dataflow_worker/executor.py:130)
at do_work (/usr/local/lib/python2.7/dist-packages/dataflow_worker/batchworker.py:642)
Run Code Online (Sandbox Code Playgroud)
问题可能是您没有将文件分组为一个包。Beam 文档中有一节介绍了它。
多文件依赖
通常,您的管道代码跨越多个文件。要远程运行您的项目,您必须将这些文件分组为一个 Python 包,并在运行管道时指定该包。当远程工作者启动时,他们将安装您的软件包。要将文件分组为 Python 包并使其远程可用,请执行以下步骤:
为您的项目创建一个setup.py文件。下面是一个非常基本的
setup.py文件。Run Code Online (Sandbox Code Playgroud)setuptools.setup( name='PACKAGE-NAME' version='PACKAGE-VERSION', install_requires=[], packages=setuptools.find_packages(), )构建您的项目,以便根目录包含
setup.py文件、主工作流文件和包含其余文件的目录。Run Code Online (Sandbox Code Playgroud)root_dir/ setup.py main.py other_files_dir/有关遵循此所需项目结构的示例,请参阅Juliaset。
使用以下命令行选项运行您的管道:
Run Code Online (Sandbox Code Playgroud)--setup_file /path/to/setup.py注意:如果您创建了一个 requirements.txt 文件并且您的项目跨越多个文件,您可以去掉 requirements.txt 文件,而是将 requirements.txt 中包含的所有包添加到 setup 调用的 install_requires 字段(在步骤 1 中) )。