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

her*_*erb 2 python amazon-s3 amazon-web-services pyspark aws-glue

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

文件指出,这应该是可能的之前的Stack Overflow讨论,尤其是其中一个答案中的一条评论似乎提供了进一步的证明。但是,我不清楚该怎么做。

因此,目标是将pip installed软件包转换为一个或多个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

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

her*_*erb 8

因此,在浏览了过去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"

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

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

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

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