熊猫& AWS Lambda

时间:2016-03-17 08:20:37

标签: pandas aws-lambda

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

在搜索了几个小时后,我似乎无法找到我正在寻找的内容,并且关于此主题的文档不存在。

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

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

不幸的是,我无法成功复制任何关于主题的指南,因为它们大多数将大熊猫与我不需要的scipy结合起来,并增加了额外的负担。

14 个答案:

答案 0 :(得分:16)

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

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

    import pandas
    pandas.__file__
    

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

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

    zip -r9 my_lambda.zip pandas/
    zip -9 my_lambda.zip my_lambda_function.py
    
  5. 您还可以将代码部署到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 :(得分:11)

经过一些修补和谷歌搜索后,我能够让一切工作并设置一个可以在将来克隆的回购。

关键要点:

  1. 所有静态包必须在ec2亚马逊Linux实例上编译
  2. python代码需要在执行前加载lib /文件夹中的库。
  3. Github回购: https://github.com/moesy/AWS-Lambda-ML-Microservice-Skeleton

答案 2 :(得分:4)

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

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

事实证明,亚马逊在re:Invent 2018中发布了图层的概念。这是一个很棒的功能。这篇中型帖子比我在这里描述的要好得多:Creating New AWS Lambda Layer For Python Pandas Library

答案 3 :(得分:2)

仓库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

答案 4 :(得分:2)

@ashtonium的答案实际上有效,并且很可能是最简单的答案,但是,还需要一些其他步骤。另外,Pandas需要Pytz(在@ b3rt0提供的链接中提到),因此也需要包装。

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

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

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

/欢呼声

答案 5 :(得分:2)

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

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

遵循说明(在AWS Lambda层下)here.

答案 6 :(得分:1)

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

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

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

答案 7 :(得分:1)

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

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

  • 对于Python 2.7:module-name-version-cp27-cp27mu-manylinux1_x86_64.whl
  • 对于Python 3.6:module-name-version-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...]

答案 8 :(得分:0)

ryfeus在github上有一些预编译的软件包。

答案 9 :(得分:0)

我的解决方案是维护进入我的层的2个package.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 synthcdk deploy \* --profile profile_name

如果有帮助,我的Provided_linux_installs.txt如下所示:

pandas==1.1.0
numpy==1.19.1
pytz==2020.1
python-dateutil==2.8.1

答案 10 :(得分:0)

# 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层

答案 11 :(得分:0)

python 3.8 windows 10 lambda aws 熊猫

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

  1. sudo mkdir python
  2. sudo pip3 install --target python pandas
  3. sudo zip -r pandas.zip python
  4. 创建一个公共 s3 存储桶,上传 pandas.zip,获取公共 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:\用户\您的用户\桌面
  4. 从上面运行第 4-6 步

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

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

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

答案 12 :(得分:0)

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

这个来自 keithrozario 的 github 存储库有大量的预构建层,您可以通过 arn 简单地将其添加到您的 lambda 中,其中有一些很棒的东西,比如 Pandas、请求和 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 缓存大小”错误消息。为了让 lambda 成功运行,我不得不将内存从默认的 128mb 增加。

答案 13 :(得分:0)

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

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

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