her*_*erb 2 python amazon-s3 amazon-web-services pyspark aws-glue
我正在使用AWS Glue和PySpark ETL脚本,并且想要使用辅助库,例如作为google_cloud_bigquery
我的PySpark脚本的一部分。
该文件指出,这应该是可能的。之前的Stack Overflow讨论,尤其是其中一个答案中的一条评论似乎提供了进一步的证明。但是,我不清楚该怎么做。
因此,目标是将pip install
ed软件包转换为一个或多个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文件呢?
因此,在浏览了过去48个小时我在评论中提供的材料之后,下面就是我解决该问题的方法。
注意:我使用Python2.7,因为这就是AWS Glue附带的东西。
通过遵循E. Kampf的博客文章“编写生产级PySpark作业的最佳实践”中的说明,以及该堆栈溢出的答案,以及由于随机错误而进行的一些调整,我执行了以下操作:
mkdir ziplib && cd ziplib
requirements.txt
在每一行上创建一个文件,其中包含包名称。
在其中创建一个名为deps的文件夹:
mkdir deps
virtualenv -p python2.7 .
bin/pip2.7 install -r requirements.txt --install-option --install-lib="/absolute/path/to/.../ziplib/deps"
cd deps && zip -r ../deps.zip . && cd ..
..所以现在我有了一个zip文件,如果我将它放在AWS S3上并从AWS Glue上的PySpark指向它,它似乎可以工作。
但是 ...我无法解决的问题是,由于某些包(例如Google Cloud Python客户端库)使用了所谓的隐式命名空间包(PEP-420),因此它们通常没有__init__.py
文件存在于模块中,因此import语句不起作用。我在这里茫然。