【问题标题】:Pandas & AWS Lambda熊猫和 AWS Lambda
【发布时间】:2016-07-03 11:19:45
【问题描述】:

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

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

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

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

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

【问题讨论】:

标签: pandas aws-lambda


【解决方案1】:

我相信您应该能够使用最新的 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

【讨论】:

  • Mac 上的路径是:/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/pandas
  • @hackwithharsha 参考这个答案stackoverflow.com/a/57969190/358013
【解决方案2】:

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

要点:

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

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

【讨论】:

  • @dsvensson 请再看一下它从源代码构建二进制文件的存储库。
  • 但这需要一个 ec2 实例。如何避免这种情况?
  • @JohnAndrews 如果你有一台 linux 机器,同样的步骤可以在你的本地完成。最基本的要求就是 Lambda 在 Linux 上运行,因此非 Amazon API 的编译需要在 Linux 上构建。
【解决方案3】:

我设法使用 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

【讨论】:

【解决方案4】:

另一种选择是下载本文讨论的预编译轮文件: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...]

【讨论】:

  • 这不起作用。我所做的是,得到 pandas-0.24.2 及其依赖项(numpy-1.16.2、python-dateutil-2.8.0、pytz-2018.9、6-1.12.0),所有 cp36-cp36m-manylinux1_x86_64.whl 来自 @ 987654323@ 并解压缩并放入单个 windows 文件夹中。放入 Python 代码,压缩并上传。出现错误:无法导入模块“lambda_function”:没有名为“lambda_function”的模块
  • 听起来像是在期待默认的 python 文件名。您的 lambda_function.py 文件是否与各种包文件夹一起位于 .zip 文件的根目录中?
【解决方案5】:

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

我最近遇到了类似的问题,我认为在此处添加最新的解决方案以供将来面临相同问题的用户使用是个好主意。

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

【讨论】:

  • 不确定这是对原始问题的回答。您仍然需要通过包含正确编译的二进制文件的部署包来创建 Lambda 层。 Lambda 层只是使这些依赖项可跨多个函数重用。
【解决方案6】:

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

【讨论】:

    【解决方案7】:

    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

    【讨论】:

    • 这正是我一直在寻找的——一个我可以简单地解析 arn 以访问 numpy 和 pandas 的解决方案!刚刚经过测试,它就像一个魅力。
    【解决方案8】:

    @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. 在您上传 zip 文件的 AWS 管理控制台中创建一个新层

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

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

    /干杯

    【讨论】:

    • 这太完美了——谢谢!我已经为此奋斗了几天,至少可以说令人沮丧。我读过的文章几乎与此内容相同,但周围有很多绒毛,因此很难理解。这是我找到的第一个简明解释,我能够在几分钟内启动并运行我的层。
    • 不用担心@B.Youngman!我昨天刚用过这个解决方案。
    【解决方案9】:

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

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

    按照说明(在 AWS Lambda 层下)here.

    【讨论】:

      【解决方案10】:

      我的解决方案是在我的层中维护 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

      如果有帮助,我提供的_linux_installs.txt 如下所示:

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

      【讨论】:

      • 有趣的解决方案,你为什么要在第二个pip 电话中使用--no-deps?如果您使用具有其他依赖项的东西,我认为这是不正确的?
      • 只是在没有的情况下运行代码并得到了这个好消息....“当使用--python-version、--platform、--abi 或--implementation 限制平台和解释器约束时, --no-deps 必须设置,或者 --only-binary=:all: 必须设置并且 --no-binary 不能设置(或者必须设置为 :none:)。"
      • @Jimbo 听起来不错。老实说,我不完全记得,但我认为我必须做一两轮获取错误消息以确保我在一个需求文件中拥有所有依赖项(带有值得注意的是pytz,它也需要作为linux版本加载)
      【解决方案11】:
      # 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 层

      【讨论】:

        【解决方案12】:

        python 3.8 windows 10 lambda 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. 创建公共 s3 存储桶,上传 pandas.zip,获取公共 URL。
        5. 使用上面的 s3 URL 创建新的 lambda 层。
        6. 向 lambda 函数添​​加层并像往常一样将 pandas 作为 pd 导入

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

        1. sudo apt install python3.8 zip unzip 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 文档的原因。

        【讨论】:

          【解决方案13】:

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

          这个来自 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 成功运行。

          【讨论】:

            【解决方案14】:

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

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

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

            【讨论】:

              【解决方案15】:

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

              我一直将这些用于我的开源项目和其他东西。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2022-11-13
                • 2017-07-17
                • 2021-10-12
                • 2017-01-24
                • 2020-08-20
                • 1970-01-01
                • 1970-01-01
                • 2013-09-26
                相关资源
                最近更新 更多