Google Dataflow - 无法导入自定义 Python 模块

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)

Mic*_*ler 9

问题可能是您没有将文件分组为一个包。Beam 文档中有一节介绍了它。

多文件依赖

通常,您的管道代码跨越多个文件。要远程运行您的项目,您必须将这些文件分组为一个 Python 包,并在运行管道时指定该包。当远程工作者启动时,他们将安装您的软件包。要将文件分组为 Python 包并使其远程可用,请执行以下步骤:

  1. 为您的项目创建一个setup.py文件。下面是一个非常基本的setup.py文件。

    setuptools.setup(
        name='PACKAGE-NAME'
        version='PACKAGE-VERSION',
        install_requires=[],
        packages=setuptools.find_packages(),
    )
    
    Run Code Online (Sandbox Code Playgroud)
  2. 构建您的项目,以便根目录包含setup.py文件、主工作流文件和包含其余文件的目录。

    root_dir/
        setup.py
        main.py
        other_files_dir/
    
    Run Code Online (Sandbox Code Playgroud)

有关遵循此所需项目结构的示例,请参阅Juliaset

  1. 使用以下命令行选项运行您的管道:

    --setup_file /path/to/setup.py
    
    Run Code Online (Sandbox Code Playgroud)

注意:如果您创建了一个 requirements.txt 文件并且您的项目跨越多个文件,您可以去掉 requirements.txt 文件,而是将 requirements.txt 中包含的所有包添加到 setup 调用的 install_requires 字段(在步骤 1 中) )。

  • 值得注意的是,“setup.py”文件位于运行最终“python”命令的同一目录中,那么您必须在其前面加上“./”:“--setup_file ./setup.py” (3认同)