将 AWS Glue Python 与 NumPy 和 Pandas Python 包一起使用

Posted

技术标签:

【中文标题】将 AWS Glue Python 与 NumPy 和 Pandas Python 包一起使用【英文标题】:Use AWS Glue Python with NumPy and Pandas Python Packages 【发布时间】:2018-03-01 22:59:29 【问题描述】:

在 AWS 上名为 Glue 的新 ETL 工具中使用 NumPy 和 Pandas 等包的最简单方法是什么?我在 Python 中有一个完整的脚本,我想在使用 NumPy 和 Pandas 的 AWS Glue 中运行。

【问题讨论】:

你能提供熊猫库(jar 文件)的链接,我可以将它作为依赖 jar 添加到胶水作业中。谢谢 【参考方案1】:

您可以检查使用此脚本作为粘合作业安装的最新 python 包

import logging
import pip
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)

if __name__ == '__main__':
    logger.info(pip._internal.main(['list']))

截至30-Jun-2020 Glue 已经预装了这些 python 包。所以numpypandas 被覆盖了。

awscli 1.16.242
boto3 1.9.203
botocore 1.12.232
certifi 2020.4.5.1
chardet 3.0.4
colorama 0.3.9
docutils 0.15.2
idna 2.8
jmespath 0.9.4
numpy 1.16.2
pandas 0.24.2
pip 20.0.2
pyasn1 0.4.8
PyGreSQL 5.0.6
python-dateutil 2.8.1
pytz 2019.3
PyYAML 5.2
requests 2.22.0
rsa 3.4.2
s3transfer 0.2.1
scikit-learn 0.20.3
scipy 1.2.1
setuptools 45.1.0
six 1.14.0
urllib3 1.25.8
virtualenv 16.7.9
wheel 0.34.2

如果它们存在于用于构建附加.whlrequirements.txt 中,您可以在glue-python 中安装其他包。 whl 文件在您的脚本启动之前被收集和安装。我还建议您研究 Sagemaker Processing,这对于基于 python 的工作来说更容易。与glue-python shell 的无服务实例不同,您不受限于16gb 的限制。

【讨论】:

【参考方案2】:

我认为当前的答案是您不能。根据AWS Glue Documentation:

只能使用纯 Python 库。尚不支持依赖 C 扩展的库,例如 pandas Python 数据分析库。

但即使我尝试在 S3 中包含一个普通的 python 编写的库,Glue 作业也会因为一些 HDFS 权限问题而失败。如果您找到解决此问题的方法,也请告诉我。

【讨论】:

这些已经是粘合节点的一部分,如果你想安装自己的包,也有办法做到这一点 已过时 Glue v 2.0 有一组内置库,包括已编译的扩展,包括 pandas【参考方案3】:

如果您没有纯 Python 库但仍想使用,则可以使用以下脚本在 Glue 代码中使用它:

import os
import site
from setuptools.command import easy_install
install_path = os.environ['GLUE_INSTALLATION']
easy_install.main( ["--install-dir", install_path, "<library-name>"] )
reload(site)


import <installed library>

【讨论】:

在哪里定义 GLUE_INSTALLATION?它的价值应该是多少? 您使用的是 Glue pyspark 作业还是 python shell 作业?它仅适用于 python shell 作业,并且 GLUE_INSTALLATION 值将从 os 环境变量中读取。 我们正在尝试安装 psycopg2 库,但它抛出错误:pypi.org/simple 上的下载错误:[Errno 99] 无法分配请求的地址——可能找不到某些包!使用 python shell 作业错误找不到 psycopg2 的本地包或工作下载链接:找不到 Requirement.parse('psycopg2') 的合适分布 没关系,这似乎是 VPC 问题。没有 VPC,我们可以安装 pyscopg2 库 @SandeepFatangare 您是否能够在 Glue 中安装 psycopg2 库,如果可以,请您提供必要的步骤。谢谢。【参考方案4】:

有更新:

...您现在可以使用 Python shell 作业... ...AWS Glue 中的 Python shell 作业支持与 Python 2.7 兼容的脚本,并且预加载了 Boto3、NumPy、SciPy、pandas 等库。

https://aws.amazon.com/about-aws/whats-new/2019/01/introducing-python-shell-jobs-in-aws-glue/

【讨论】:

具体来说,他们支持的库在这里:docs.aws.amazon.com/glue/latest/dg/…【参考方案5】:

当您单击运行作业时,您有一个默认折叠的作业参数(可选)按钮,当我们单击它时,我们有以下选项可用于将库保存在 s3 中,这对我有用:

Python 库路径

s3://bucket-name/folder-name/file-name

依赖的jars路径

s3://bucket-name/folder-name/file-name

参考文件路径 s3://bucket-name/folder-name/file-name

【讨论】:

我创建了一个胶水作业并上传了python脚本pandas-0.22.0.tar、pandas-0.22.0-cp27-cp27mu-manylinux1_x86_64.whl文件。但是我的工作因错误“import pandas as pd ImportError: No module named pandas”而失败?请建议需要上传哪些其他文件,以解决熊猫错误。 pandas*.tar 文件上传到依赖 jars 路径 根据 AWS Glue 文档:“只能使用纯 Python 库。尚不支持依赖 C 扩展的库,例如 pandas Python 数据分析库。”【参考方案6】:

自 2019 年以来,选择的答案不再正确

awswrangler 是您所需要的。 它允许您在胶水和 lambda 中使用 pandas

https://github.com/awslabs/aws-data-wrangler

使用 AWS Lambda 层安装

https://aws-data-wrangler.readthedocs.io/en/latest/install.html#setting-up-lambda-layer

示例:典型的 Pandas ETL

import pandas
import awswrangler as wr

df = pandas.read_...  # Read from anywhere

# Typical Pandas, Numpy or Pyarrow transformation HERE!

wr.pandas.to_parquet(  # Storing the data and metadata to Data Lake
    dataframe=df,
    database="database",
    path="s3://...",
    partition_cols=["col_name"],
)

【讨论】:

【参考方案7】:

2020 年 8 月发布的 AWS Glue 版本 2.0 现在默认安装了 pandas 和 numpy。 详情请见https://docs.aws.amazon.com/glue/latest/dg/reduced-start-times-spark-etl-jobs.html#reduced-start-times-new-features。

【讨论】:

【参考方案8】:

如果您要编辑作业(或创建新作业时),则会有一个折叠的可选部分,称为“脚本库和作业参数(可选)”。在那里,您可以为 Python 库(以及其他东西)指定一个 S3 存储桶。我还没有亲自尝试过那部分,但我认为这就是你要找的。​​p>

【讨论】:

如果您想要包含多个模块,您可以将它们归档到单个 ZIP 文件中,并通过“脚本库和作业参数”参数附加。您的模块将可用于运行中的作业。【参考方案9】:

到目前为止,您可以将 Python 扩展模块和库与您的 AWS Glue ETL 脚本一起使用,只要它们是用纯 Python 编写的。目前不支持 Pandas 等 C 库,也不支持用其他语言编写的扩展。

【讨论】:

【参考方案10】:

AWS GLUE 库/依赖关系并不复杂

添加所需的包基本上有三种方式

方法 1

    通过 AAWS 控制台 UI/JOB 定义,以下是一些帮助屏幕 操作 --> 编辑作业

    然后一直向下滚动并展开

    安全配置、脚本库和作业参数(可选)

    然后将所有包作为 .zip 文件添加到 Python 库路径 (您需要将 .zip 文件添加到 S3,然后指定路径)

    这里的一个问题是您需要确保您的 zip 文件必须包含 init根文件夹中的.py

而且,如果您的包依赖于另一个包,那么添加这些包将非常困难。

方法2

以编程方式安装您的软件包(简单)

这里是您可以安装所需库的路径

/home/spark/.local/lib/python3.7/site-packages/

**

/home/spark/.local/lib/python3.7/site-packages/

**

这里是安装 AWS 包的例子 我在这里安装了 SAGE 标记包

import site
from importlib import reload 
from setuptools.command import easy_install
# install_path = site.getsitepackages()[0]
install_path = '/home/spark/.local/lib/python3.7/site-packages/'
easy_install.main( ["--install-dir", install_path, "https://files.pythonhosted.org/packages/60/c7/126ad8e7dfbffaf9a5384ca6123da85db6c7b4b4479440ce88c94d2bb23f/sagemaker-2.3.0.tar.gz"] )
reload(site)

方法 3。(建议且干净)

安全配置、脚本库和作业参数(可选)部分到作业参数

使用 --additional-python-modules 参数添加所需的库 您可以根据需要使用逗号分隔符指定尽可能多的包

乐于助人

【讨论】:

请注意,方法 2 会导致警告:easy_install 命令已弃用,将在未来版本中删除。【参考方案11】:

要安装特定版本(例如,对于 AWS Glue python 作业),请导航到包含 python 包的网站,例如包“pg8000”的页面https://pypi.org/project/pg8000/1.12.5/#files

然后选择合适的版本,将链接复制到文件中,粘贴到下面的sn-p中:

import os
import site
from setuptools.command import easy_install
install_path = os.environ['GLUE_INSTALLATION']

easy_install.main( ["--install-dir", install_path, "https://files.pythonhosted.org/packages/83/03/10902758730d5cc705c0d1dd47072b6216edc652bc2e63a078b58c0b32e6/pg8000-1.12.5.tar.gz"] )
reload(site)

【讨论】:

GLUE_INSTALLATION 在 AWS Glue PySpark 中不存在【参考方案12】:

如果您想将 python 模块集成到您的 AWS GLUE ETL 作业中,您可以这样做。你可以使用任何你想要的 Python 模块。

因为 Glue 只不过是带有 Python 运行环境的无服务器。所以你只需要使用pip install -t /path/to/your/directory 打包你的脚本需要的模块。然后上传到您的 s3 存储桶。

在创建 AWS Glue 作业时,在指向 s3 脚本、临时位置后,如果您转到高级作业参数选项,您将在那里看到 python_libraries 选项。

enter image description here

您可以将其指向您上传到 s3 的 python 模块包。

【讨论】:

从您的评论中,我了解到,如果我在作业脚本中打包、上传和引用用于导入的库,我将能够在 Glue 中运行非纯 Python 库,例如 pandas 和 pymongo?从接受的答案中提到的文档中,我了解到我将无法运行此类库。有没有人能够让它工作? 是的,您可以使用。您甚至可以编写自己的工作所需的 Python 函数或模块,并在您的 Python 库路径中引用它们。 不,您不能使用位于 c/c++ 代码之上的库。您只能使用纯 python 库。 Pandas 核心代码在 C 中,因此不能在 Glue 中使用

以上是关于将 AWS Glue Python 与 NumPy 和 Pandas Python 包一起使用的主要内容,如果未能解决你的问题,请参考以下文章

AWS Glue Python Shell 与 Oracle 的连接

AWS Python Shell - 如何使用 Glue 目录连接

将 Spark fileoutputcommitter.algorithm.version=2 与 AWS Glue 一起使用

SMTP:邮件未通过 AWS Glue Python 作业发送

Python/Pyspark 迭代代码(用于 AWS Glue ETL 作业)

AWS Glue Python-Shell:如何提供自己的库?