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

2024-04-04

我正在使用 AWS Glue 和 PySpark ETL 脚本,并且想要使用辅助库,例如google_cloud_bigquery作为我的 PySpark 脚本的一部分。

The 文档说明这应该是可能的 https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-python-libraries.html. 之前的 Stack Overflow 讨论 https://stackoverflow.com/questions/46329561/aws-glue-python,尤其是其中一个答案中的一条评论似乎提供了额外的证据。然而,how我不清楚该怎么做。

所以目标是转动pip install将包打包到一个或多个 zip 文件中,以便能够将包托管在 S3 上并像这样指向它们:

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

How that我看过的任何地方都没有明确说明应该做什么。

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

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

..所以不知道如何将它们转换为 AWS Glue 可以消化的 zip 文件。也许使用 .tar.gz 我可以tar -xf他们然后zip它们会备份,但是whl 文件呢?


因此,在查看了过去 48 小时内我在评论中获取的材料后,我解决了这个问题。

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

按照中的说明进行操作E. Kampf 的博客文章“编写生产级 PySpark 作业的最佳实践” https://developerzen.com/best-practices-writing-production-grade-pyspark-jobs-cb688ac4d20f and 这个堆栈溢出答案 https://stackoverflow.com/questions/17486578/how-can-you-bundle-all-your-python-code-into-a-single-zip-file以及由于随机错误而进行的一些调整,我做了以下操作:

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

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"

  1. cd 进入 deps 文件夹并将其内容压缩到父文件夹中的 zip 存档 deps.zip 中,然后 cd 退出 deps 文件夹:

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

..现在我有了一个 zip 文件,如果我将其放入 AWS S3 并从 AWS Glue 上的 PySpark 指向它,它似乎可以工作。

HOWEVER...我无法解决的是因为某些包(例如 Google Cloud Python 客户端库)使用所谓的隐式命名空间包 (PEP-420) https://www.python.org/dev/peps/pep-0420/,他们没有__init__.py文件通常存在于模块中,因此 import 语句不起作用。我在这里不知所措。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐