如何将 pip / pypi 安装的 python 包转换为要在 AWS Glue 中使用的 zip 文件



我正在使用 AWS Glue 和 PySpark ETL 脚本,并希望使用google_cloud_bigquery等辅助库作为 PySpark 脚本的一部分。

文档指出这应该是可能的。之前的堆栈溢出讨论,尤其是其中一个答案中的一条评论似乎提供了额外的证据。但是,我不清楚如何做。

因此,目标是将pip install的软件包转换为一个或多个zip文件,以便能够在S3上托管软件包并像这样指向它们:

s3://bucket/prefix/lib_A.zip,s3://bucket_B/prefix/lib_X.zip

应该如何做到这一点,在我看过的任何地方都没有明确说明。

即如何pip install一个包,然后将其转换为可以上传到 S3 的 zip 文件,以便 PySpark 可以将其与这样的 S3 URL 一起使用?

通过使用命令pip download我已经能够获取库,但默认情况下它们不是.zip文件,而是 .whl 文件或.tar.gz

..所以不确定该怎么做才能将它们转换为 AWS Glue 可以消化的 zip 文件。也许有了.tar.gz我可以tar -xf它们,然后zip它们备份,但是 whl 文件呢?

因此,在浏览了过去 48 小时内我在评论中获取的材料后,以下是我解决问题的方法。

注意:我使用 Python2.7,因为 AWS Glue 似乎附带了它。

按照 E. Kampf 的博客文章"编写生产级 PySpark 作业的最佳实践"中的说明和这个堆栈溢出答案,以及由于随机错误而进行的一些调整,我做了以下工作:

  1. 创建一个名为 ziplib 的新项目文件夹并 cd 到其中:

mkdir ziplib && cd ziplib

  1. 创建一个requirements.txt文件,每行都有包的名称。

  2. 在其中创建一个名为 deps 的文件夹:

mkdir deps

  1. 当前文件夹中使用 python 2.7 创建一个新的 virtualenv 环境:

virtualenv -p python2.7 .

    使用
  1. 绝对路径将需求安装到文件夹 deps 中(否则不起作用):

bin/pip2.7 install -r requirements.txt --install-option --install-lib="/absolute/path/to/.../ziplib/deps"

    cd 到 deps 文件夹中,
  1. 并将其内容压缩到 zip 存档 deps.zip 在父文件夹中,然后从 deps 文件夹中 cd:

cd deps && zip -r ../deps.zip . && cd ..

..所以现在我有一个zip文件,如果我把它放到AWS S3上,然后从AWS Glue上的PySpark指向它,它似乎可以工作。

不过...我无法解决的是,由于某些包(例如 Google Cloud Python 客户端库)使用所谓的隐式命名空间包 (PEP-420),它们没有模块中通常存在的__init__.py文件,因此导入语句不起作用。我在这里不知所措。

最新更新