我正在使用 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 作业的最佳实践"中的说明和这个堆栈溢出答案,以及由于随机错误而进行的一些调整,我做了以下工作:
- 创建一个名为 ziplib 的新项目文件夹并 cd 到其中:
mkdir ziplib && cd ziplib
-
创建一个
requirements.txt
文件,每行都有包的名称。 -
在其中创建一个名为 deps 的文件夹:
mkdir deps
- 在
- 当前文件夹中使用 python 2.7 创建一个新的 virtualenv 环境:
virtualenv -p python2.7 .
- 使用
- 绝对路径将需求安装到文件夹 deps 中(否则不起作用):
bin/pip2.7 install -r requirements.txt --install-option --install-lib="/absolute/path/to/.../ziplib/deps"
- cd 到 deps 文件夹中,
- 并将其内容压缩到 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
文件,因此导入语句不起作用。我在这里不知所措。