【问题标题】:How can I install a python package onto Google Dataflow and import it into my pipeline?如何在 Google Dataflow 上安装 python 包并将其导入我的管道?
【发布时间】:2018-09-08 21:39:57
【问题描述】:

我的文件夹结构如下:

Project/
 --Pipeline.py
 --setup.py
 --dist/
  --ResumeParserDependencies-0.1.tar.gz
 --Dependencies/
        --Module1.py
        --Module2.py
        --Module3.py

我的setup.py 文件如下所示:

from setuptools import setup, find_packages

setup(name='ResumeParserDependencies',
  version='0.1',
  description='Dependencies',
  install_requires=[
   'google-cloud-storage==1.11.0',
   'requests==2.19.1',
   'urllib3==1.23'
    ],
  packages = ['Dependencies']
 )

我使用 setup.py 文件使用“python setup.py sdist”创建了一个 tar.gz 文件。 tar 文件位于 dist 文件夹中,名称为 ResumeParserDependencies-0.1.tar.gz。然后我指定

setup_options.extra_packages = ['./dist/ResumeParserDependencies-0.1.tar.gz'] in my pipeline options.

但是,在 Dataflow 上运行管道后,我会收到错误消息“没有名为 ResumeParserDependencies 的模块”。如果我在本地使用“pip install ResumeParserDependencies-0.1.tar.gz”,则安装包,我可以使用“pip freeze”看到它。


将包加载到 Dataflow 中我缺少什么?

【问题讨论】:

    标签: python google-cloud-dataflow


    【解决方案1】:

    我更改了我的文件夹结构并让它工作:

    Project/
    --Pipeline.py
    --setup.py
    --Module1/
        --__init__.py
    --Module2/
        --__init__.py
    --Module3/
        --__init__.py
    

    setup.py 文件现在如下所示: 从 setuptools 导入设置,find_packages

    setup(name='ResumeParserDependencies',
      version='0.1',
      description='Dependencies',
      install_requires=[
       'google-cloud-storage==1.11.0',
       'urllib3==1.23'
        ],
      packages = find_packages()
     )
    

    在我的管道中,我指定:

    setup_options.setup_file = './setup.py'
    

    我不需要:

    setup_options.extra_packages = ['./dist/ResumeParserDependencies-0.1.tar.gz']
    

    参考: find_packages doesn't find my Python file

    【讨论】:

    • 一个更简单的选择是只使用一个 requirements.txt 文件,你的 setup.py 没有安装任何自定义的东西,它是 pypi 中的所有东西。 setup_options.requirements_file = './requirements.txt'。数据流运行器为您完成所有下载、打包和部署,无需预先准备额外的包,除非它们是未发布到 pypi 的东西,或者它们是需要预编译的 C 或 Fortran 依赖项,如果您是这样做确保它是为 GCP 用于其容器的 Linux 版本编译的。
    • 哦,等等,您确实需要 find_packages(),因为您的管道引用了 Module1 等(从技术上讲,这些是包而不是模块,因为您有 init.py 文件在那里:))
    • 答案是正确的,或者,您也可以使用命令行选项--setup_file /path/to/setup.py 运行管道。见beam.apache.org/documentation/sdks/python-pipeline-dependencies/…
    【解决方案2】:

    发生此问题时,通常是由于 SDK 或 Worker 依赖项的版本不匹配。为了解决您的问题,check your Dataflow versionWorker Dependencies for the SDK version 验证您是否正在运行兼容版本。

    【讨论】:

    • 我在 virtualenv 中运行了pip install --upgrade apache-beam[gcp],发现我运行的是 2.6.0 版。我还继续将 setuptools 升级到 40.2.0。我不相信“install_requires”软件包有任何问题。问题在于无法导入/使用Module1Module2Module3
    • google-cloud-dataflow 使用的是什么版本?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-15
    相关资源
    最近更新 更多