Pandas & AWS 拉姆达

Pandas & AWS Lambda

是否有人拥有与 AWS Lambda 兼容的 pandas 的完全编译版本?

搜索了几个小时后,我似乎找不到我要找的东西,而且关于这个主题的文档也不存在。

我需要在 lambda 函数中访问该包,但是我未能成功地使该包正确编译以在 Lambda 函数中使用。

任何人都可以提供可重现的步骤来代替编译来创建二进制文件吗?

不幸的是,我无法成功复制有关主题的任何指南,因为它们大多将 pandas 与 scipy 结合在一起,而我不需要这些并增加了额外的负担。

我相信您应该能够使用最近的 pandas 版本(或者可能是您机器上的版本)。你可以像这样自己用 pandas 创建一个 lambda 包,

  1. 首先找到 pandas 软件包在您机器上的安装位置,即打开 python 终端并输入

    import pandas
    pandas.__file__
    

    那应该打印类似 '/usr/local/lib/python3.4/site-packages/pandas/__init__.py'

  2. 现在从该位置(在本例中为 '/usr/local/lib/python3.4/site-packages/pandas)复制 pandas 文件夹并将其放入您的存储库。
  3. 像这样用 pandas 打包您的 Lambda 代码:

    zip -r9 my_lambda.zip pandas/
    zip -9 my_lambda.zip my_lambda_function.py
    

您还可以将代码部署到 S3 并让您的 Lambda 使用来自 S3 的代码。

aws s3 cp  my_lambda.zip s3://dev-code//projectx/lambda_packages/

Here's the repo that will get you started

经过一些修补和大量谷歌搜索后,我能够使一切正常工作并设置一个可以在将来克隆的存储库。

要点:

  1. 所有静态包都必须在 ec2 amazon Linux 实例
  2. 上编译
  3. python代码在执行前需要加载lib/文件夹中的库。

Github 回购: https://github.com/moesy/AWS-Lambda-ML-Microservice-Skeleton

我设法使用 python3.6 runtime 在 aws lambda 中部署了 pandas 代码。这是我遵循的步骤:

  1. 将所需的库添加到 requirements.txt
  2. 在 docker 容器中构建项目(使用 aws sam cli : sam build --use-container)
  3. 运行 代码(sam local invoke --event test.json)

这是一个帮手:https://github.com/ysfmag/aws-lambda-py-pandas-template

另一种选择是下载预编译的 wheel 文件,如本post所述:https://aws.amazon.com/premiumsupport/knowledge-center/lambda-python-package-compatible/

基本上,您需要转到 https://pypi.org 上的项目页面并下载如下命名的文件:

  • 对于 Python 2.7:模块名称-版本-cp27-cp27mu-manylinux1_x86_64.whl
  • 对于 Python 3.6: 模块名称-版本-cp36-cp36m-manylinux1_x86_64.whl

然后将 .whl 文件解压缩到您的项目目录,并将内容与您的 lambda 代码一起重新压缩。

注意:Python 主要功能文件必须位于生成的部署包 .zip 文件的根文件夹中。其他 Python 模块和依赖项可以位于子文件夹中。类似于:

my_lambda_deployment_package.zip
├───lambda_function.py
├───numpy
│   ├───[subfolders...]
├───pandas
│   ├───[subfolders...]
└───[additional package folders...]

我知道这个问题是几年前提出的,当时 Lambda 处于不同的阶段。

我最近遇到了类似的问题,我认为为未来遇到同样问题的用户添加最新的解决方案是个好主意。

原来amazon在re:Invent2018年就发布了layers的概念,真是一个很棒的功能。这个 post 中的描述比我在这里描述的要好得多:Creating New AWS Lambda Layer For Python Pandas Library

ryfeus github 上有一些预编译包。

repo mthenw/awesome-layers 列出了几个公开可用的 aws lambda 层。

特别是,keithrozario/Klayers 有 pandas+numpy 并且截至今天是最新的 pandas 0.25。

它的 ARN 是 arn:aws:lambda:us-east-1:113088814899:layer:Klayers-python37-pandas:1

@ashtonium 的答案确实有效,而且很可能是最简单的,但是,还需要一些额外的步骤。此外,Pandas 需要 Pytz(在 @b3rt0 提供的 link 中提到),因此也需要该包。

  1. 从 PyPI 下载 whl 文件(Pandas file ends with ...manylinux1_x86_64.whl, there is only one Pytz 相关文件)
  2. 使用终端命令解压 whl 文件,例如unzip filename.whl (Linux/MacOS)
  3. 创建一个新的文件夹结构python/lib/python3.7/site-packages/(将 3.7 换成您选择的版本)
  4. 将步骤 2 中的文件夹移动到步骤 3 中的站点包文件夹
  5. 以新结构压缩根文件夹,即python
  6. 在上传 zip 文件的 AWS 管理控制台中创建一个新层

这是一个很常见的问题,希望我的解决方案有所帮助。

2020 年 8 月 19 日更新: Wheel 文件并非适用于所有软件包。在这些情况下,您可以跳到第 3 步,进入 site-packages 文件夹并使用 pip3 install PACKAGE_NAME -t . 在其中安装包(不需要 venv)。有些软件包比其他软件包更容易,有些则更棘手。例如,Psycopg2 要求您仅移动两个(截至撰写本文时)包文件夹之一。

/干杯

让 pandas 在 Lambda 函数中工作的最简单方法是利用 Lambda Layers 和 AWS Data Wrangler。 Lambda 层是一个包含库或依赖项的 zip 存档。根据 AWS 文档,使用层可以使您的部署包变小,从而使开发更容易。

AWS Data Wrangler 是一个开源包,可将 pandas 的功能扩展到 AWS 服务。

按照说明进行操作(在 AWS Lambda 层下)here.

我的解决方案是在我的层中维护 2 个 requirements.txt 包样式文件,一个名为 provided_packages.txt,一个名为 provided_linux_installs.txt

部署前(如果软件包尚未安装)我 运行:

pip install -r provided_packages.txt -t layer_name/python/lib/python3.8/site-packages/.
pip download -r provided_linux_installs.txt --platform manylinux1_x86_64 --no-deps -d layer_name/python/lib/python3.8/site-packages

cd layer_name/python/lib/python3.8/site-packages 
unzip \*.whl
rm *.whl

然后正常部署(我用的是cdk synth & cdk deploy \* --profile profile_name

如果有帮助,我的 provided_linux_installs.txt 看起来像这样:

pandas==1.1.0
numpy==1.19.1
pytz==2020.1
python-dateutil==2.8.1
# all the step are done in AWS EC2 Linux Free tier so that all the Libraries  are compatible with the Lambda environment

# install the required packages
mkdir packages
pip3 install -t . pandas
pip3 install -t . numpy --upgrade
pip3 install -t . wikipedia --upgrade
pip3 install -t . sklearn --upgrade
pip3 install -t . pickle-mixin --upgrade
pip3 install -t . fuzzywuzzy --upgrade


# Now remove all unnecessary files
sudo rm -r *.whl *.dist-info __pycache__

# Now make a DIR so that lambda function can reconginzes
sudo mkdir -p build/python/lib/python3.6/site-packages


# Now move all the files from packages folder to site-packages folder 
sudo mv /home/ec2-user/packages/*  build/python/lib/python3.6/site-packages/

# Now move to the build packages
cd build

# Now zip all the files starting from python folder to site-packages
sudo zip -r python.zip .

将 zip 文件上传到 lambda 层

python 3.8 windows 10 λaws pandas

您需要在 linux 机器和 python 3.8 上执行以下步骤:

  1. sudo mkdir python
  2. sudo pip3 install --target python pandas
  3. sudo zip -r pandas.zip python
  4. 创建一个 public s3 存储桶,上传 pandas.zip,抓取 public URL.
  5. 使用上面的 s3 URL 创建新的 lambda 层。
  6. 向 lambda 函数添​​加层并像往常一样导入 pandas 作为 pd

没有linux机器?启动 Ubuntu EC2 实例或容器:

  1. sudo apt install python3.8 zip 解压缩 python3-pip
  2. 运行以上1-3
  3. 现在您需要将 zip 文件复制到您的本地计算机。打开命令终端并将目录更改为包含 EC2 实例的 pem 文件和 运行 的文件夹:scp -i yourPemFile.pem ubuntu@'EC2.Instance.IP.Here':/home/path/to/pandas.zip C:\Users\YourUser\Desktop
  4. 运行 上面的步骤 4-6

*对于上面的第 3 个:您需要获取 EC2 IP 并将其插入。您可能会收到有关 pem 文件权限的错误,如果您这样做,请右键单击 pem 文件 > 属性 > 安全 > 高级 > 禁用继承,并确保只有您的用户在“权限条目”中。最后,修复路径以指向 pandas.zip 文件在 EC2 实例上的位置以及您希望文件在本地结束的位置。

**注意lambda函数的python 运行时间。确保它与您用来执行 pip 操作的 python 版本相匹配(应该是 3.8)。

***原始文件夹名称“python”的命名是出于 AWS 文档中的原因。

经过大量谷歌搜索和弄乱之后,层的概念很棒,似乎对我有用。

这个来自 keithrozario 的 github 存储库有大量的预构建层,您可以通过 arn 简单地添加到您的 lambda 中,其中有一些很棒的东西,例如 pandas、requests 和 sqlalchemy。

我创建了一个模板来使用 AWS CLI 编译层(包含 python 依赖项)并将其上传到 lambda,您可以找到 in my Gitlab repo here.

我运行在 Amazon Linux EC2 上使用虚拟环境 (venv) 从 requirements.txt 文件安装库,然后将压缩文件加载到使用 AWS CLI 的 lambda。

注意 lambda 所需的文件夹结构 my_zip_file/python/binaries。

注:Pandas是一个相当大的图书馆。您的压缩图层文件必须小于 70mb。

您可能还会遇到可怕的“OpenBLAS 警告 - 无法确定此系统上的 L2 缓存大小”错误消息。我必须将内存从默认的 128mb 增加到 lambda 才能成功 运行.

搜索了几个小时后,我似乎找不到我要找的东西,而且关于这个主题的文档也不存在。

所以我决定自己构建库来支持 Amazon Linux 2 arch.

在此处阅读完整的博客https://khanakia.medium.com/add-pandas-and-numpy-python-to-aws-lambda-layers-python-3-7-3-8-694db42f6119

我已开始维护一个 GitHub 存储库,以便轻松快速地访问图层。 https://github.com/kuharan/Lambda-Layers

我一直在将它们用于我的开源项目和其他东西。