Pandas和AWS Lambda

44

有没有人有一个完全编译好的pandas版本,与AWS Lambda兼容?

在搜索了几个小时后,我似乎找不到我想要的东西,而且这方面的文档不存在。

我需要在Lambda函数中访问该软件包,但是我无法成功地将该软件包编译为适用于Lambda函数的软件包。

如果无法编译,是否有人可以提供可重现的步骤来创建二进制文件?

不幸的是,我尚未能够成功复制任何与此相关的指南,因为它们大多将pandas与我不需要的scipy组合起来,并增加了额外的负担。


1
请查看 https://dev59.com/9lsV5IYBdhLWcg3w0hhU#43766512 获取有关包含已编译代码的 Python 包(如 Pandas)的建议。 - Kevin
1
请查看此博客,您可以在几分钟内为Python 3.8创建Panda层 https://khanakia.medium.com/add-pandas-and-numpy-python-to-aws-lambda-layers-python-3-7-3-8-694db42f6119 - Khanakia
16个回答

28

我认为你应该能够使用最近的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代码:

  4. 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/
    

    这里是一个可以帮助你入门的代码库


在Mac上,路径如下:/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/pandas - aQ123
1
@hackwithharsha 可以参考这个答案 https://dev59.com/8rbna4cB1Zd3GeqPZlo5#57969190 - Chenna V

19

在一些尝试和大量谷歌搜索后,我能够使所有的东西都正常工作,并设置了一个可以在将来克隆的存储库。

要点:

  1. 所有静态程序包都必须在 ec2 亚马逊 Linux 实例上编译。
  2. Python 代码需要在执行之前加载 lib/ 文件夹中的库。

Github 存储库: https://github.com/moesy/AWS-Lambda-ML-Microservice-Skeleton


@dsvensson请再仔细查看一下存储库,它会从源代码构建二进制文件。 - Moe
1
但是这需要一个EC2实例。如何避免这个问题? - WJA
1
@JohnAndrews 如果你有一台Linux机器,同样的步骤也可以在本地完成。基本要求只是Lambda在Linux上运行,因此非Amazon API的编译需要在Linux上进行构建。 - Aakash Basu

18

这个仓库mthenw/awesome-layers列出了一些公开可用的 AWS Lambda layer。

特别地,keithrozario/Klayers包含pandas和numpy,并且截至今日已更新到pandas 0.25。

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


1
这正是我一直在寻找的——一个可以简单解析ARN以获取numpy和pandas访问权限的解决方案!刚刚测试过,效果非常好。 - mfcss

13

我知道这个问题几年前就被问过了,而当时Lambda处于不同的阶段。

最近我也遇到了类似的问题,我想把最新的解决方案添加到这里,以备未来遇到相同问题的用户参考。

事实证明,亚马逊在re:Invent 2018中发布了layers的概念。 这是一个很好的功能。 Medium上的这篇文章比我在这里描述得更好:Creating New AWS Lambda Layer For Python Pandas Library


3
不确定这是否是对原问题的回答。您仍然需要通过包含正确编译的二进制文件的部署包来创建Lambda Layer。Lambda Layers只是使这些依赖项可以在多个函数之间重复使用。 - ashtonium

10
使用Lambda层和AWS Data Wrangler是在Lambda函数中获取pandas的最简单方法。 Lambda层是包含库或依赖项的zip存档文件。根据AWS文档,使用层可以使部署包保持较小,从而使开发更加容易。
AWS Data Wrangler是一个开源软件包,将pandas的功能扩展到AWS服务。
按照说明(在AWS Lambda Layer下)这里。

5
另一个选择是按照此帖子中所述下载预编译的wheel文件: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...]

1
这不起作用。我所做的是,从https://pypi.org/获取了pandas-0.24.2及其依赖项(numpy-1.16.2、python-dateutil-2.8.0、pytz-2018.9、six-1.12.0),所有cp36-cp36m-manylinux1_x86_64.whl文件并解压缩到一个单独的Windows文件夹中。将Python代码放入其中,压缩并上传。出现错误:无法导入模块“lambda_function”:没有名为“lambda_function”的模块。 - Aakash Basu
听起来好像期望的是默认的Python文件名。你的lambda_function.py文件和各种包文件夹一起在.zip文件的根目录下吗? - ashtonium

3
@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文件。在这些情况下,您可以跳过第3步,进入site-packages文件夹,并使用pip3 install PACKAGE_NAME -t .在其中安装软件包(无需虚拟环境)。有些软件包比其他软件包更容易,有些则更棘手。例如,Psycopg2要求您仅移动两个(截至本文撰写时)软件包文件夹中的一个。

1
这太完美了 - 谢谢!我已经为此奋斗了几天,最近变得非常沮丧。我读过的文章基本上都说了与此相同的事情,但是它们周围有很多废话,让我很难理解。这是我找到的第一个简明扼要的解释,我能够在几分钟内启动我的层。 - B. Youngman
不用担心,@B.Youngman!我昨天刚用了这个解决方案。 - user3661992

2
我使用Python3.6运行时成功将pandas代码部署到AWS Lambda中。以下是我遵循的步骤:
  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

2
什么是sam? - WJA
https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/what-is-sam.html - nilsi

2

2

在github上,ryfeus提供了一些预编译的软件包。

github的链接请点击。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接