AWS lambda 中的 Pandas 给出了 numpy 错误

Posted

技术标签:

【中文标题】AWS lambda 中的 Pandas 给出了 numpy 错误【英文标题】:Pandas in AWS lambda gives numpy error 【发布时间】:2017-10-08 05:30:37 【问题描述】:

我一直在尝试在导入 pandas 的 AWS Lambda 中运行我的代码。这就是我所做的。 我有一个 python 文件,其中包含如下简单代码(此文件具有 lambda 处理程序)

import json
print('Loading function')
import pandas as pd
def lambda_handler(event, context):
    return "Welcome to Pandas usage in AWS Lambda"
    我已将此 python 文件与 numpy、pandas 和 pytz 库一起压缩为部署包(所有这些都在 Amazon EC2 linux 机器中完成) 然后将包上传到S3 创建了一个 lambda 函数 (runtime=python3.6) 并从 S3 上传了部署包

但是当我在 AWS Lambda 中测试 lambda 函数时,出现以下错误:

Unable to import module 'lambda_function': Missing required dependencies ['numpy']

我已经在压缩包中有 numpy,但我仍然收到此错误。我尝试按照Pandas & AWS Lambda 给出的提示进行操作,但没有成功。

有没有人遇到过同样的问题。希望有任何解决此问题的提示或建议。

谢谢

【问题讨论】:

哇,我不知道这这么简单(我一直在用 vanilla python 为 aws lambda 编写我自己的类似 pandas 的助手)。 你在那台 amazon linux 机器上编译过 pandas、numpy 等吗?因为你需要在那里编译它们,而不仅仅是 zip。 @AdamOwczarczyk 感谢您的回复。我花了很多时间来弄清楚如何编译/构建包。在这次尝试中,我关注了这篇博文 (blog.datapolitan.com/2015/08/25/…)。但还是不走运:( Pandas & AWS Lambda的可能重复 对于未来的读者:很多人似乎导入 pandas 或 numpy 来执行琐碎的列表转换,却没有意识到这些库有多大和过度杀伤力。通常,您可以使用现有的 Python 列表功能完全避免它们。使用 AWS Lambda 是一个更好的选择。 【参考方案1】:

编辑:我终于想通了如何在 AWS Lambda python 3.6 运行时环境中运行 pandas 和 numpy。

我已将我的部署包上传到以下存储库:

git clone https://github.com/pbegle/aws-lambda-py3.6-pandas-numpy.git

只需通过运行将您的 lambda_function.py 添加到 zip 文件中:

zip -ur lambda.zip lambda_function.py

上传到 S3 并源到 lambda。

原文:

让 Pandas 在 lambda 函数中工作的唯一方法是按照 this blog post 中的步骤在 AWS Linux EC2 实例中编译 pandas(和 numpy)库,然后为我的 lambda 函数使用 python 2.7 运行时.

【讨论】:

很想知道如何在 python 3.6 运行时环境中完成它,但如果有人弄清楚的话! 你能解释一下你是怎么做到的吗?我希望能够将其扩展到其他包。谢谢! 我写了一篇关于如何做到这一点的博文。看看:medium.com/i-like-big-data-and-i-cannot-lie/… 我现在遇到了类似的问题。只需从此 repo 中获取所有子文件夹并与我尝试上传的 lambda 一起使用。这也有效【参考方案2】:

要在您的 lambda zip 中包含 numpy,请按照 AWS 文档中此页面上的说明进行操作...

How do I add Python packages with compiled binaries to my deployment package and make the package compatible with AWS Lambda?

以 numpy 为例解释说明:

    在 pypi.org 打开模块页面。 https://pypi.org/project/numpy/

    选择下载文件。

    下载:

对于 Python 2.7,模块名称-版本-cp27-cp27mu-manylinux1_x86_64.whl

例如numpy-1.15.2-cp27-cp27m-manylinux1_x86_64.whl

对于 Python 3.6,模块名称-版本-cp36-cp36m-manylinux1_x86_64.whl

例如numpy-1.15.2-cp36-cp36m-manylinux1_x86_64.whl

    解压 /path/to/project-dir 文件夹中的 wheel 文件。 您可以在命令行上使用 unzip 命令来执行此操作。显然还有其他方法。

unzip numpy-1.15.2-cp36-cp36m-manylinux1_x86_64.whl

wheel 文件解压后,您的部署包将与 Lambda 兼容。

希望一切都有意义;)

最终结果可能看起来像这样。 注意:您不应该在部署包中包含 whl 文件。

【讨论】:

我面临同样的问题,当我像这样复制 numpy 时,pandas 给出了这个错误 - C 扩展:没有构建名为“pandas._libs.tslibs.conversion”的模块。如果您想从源目录导入 pandas,您可能需要先运行“python setup.py build_ext --inplace --force”来构建 C 扩展。 -- 关于这个的任何想法 我按照本教程一步一步地做了同样的事情,但我没有成功aws.amazon.com/premiumsupport/knowledge-center/…。所以我也跟着这个 AWS 官方教程,所以我又遇到了同样的问题:aws.amazon.com/premiumsupport/knowledge-center/…。我不知道该怎么办了。有什么想法?我正在使用 Mac OS。 这对我有用!我一直在 AWS Lambda 中使用 Python3.7 运行时环境,而不是其他人似乎都在使用的 Python3.6。无论如何,我刚刚下载了 numpy cp37-cp37m-manylinux_x86_64.whl,然后我解压缩它,然后我的lambda_function.pynumpy 目录和numpy.dist-info 目录都有一个压缩包!上传,然后砰!都很好。无需通过 EC2 安装,无需 docker。简单明了,我喜欢它! @Dimuthu 有什么解决办法吗?我也面临同样的问题【参考方案3】:

经过大量研究,我能够使其与 Lambda 层一起使用。

创建或打开一个干净的目录并按照以下步骤操作:

先决条件:确保您已启动并运行 Docker

    使用以下内容创建 requirements.txt 文件:
pandas==0.23.4
pytz==2018.7
    使用以下内容创建 get_layer_packages.sh 文件:
#!/bin/bash

export PKG_DIR="python"

rm -rf $PKG_DIR && mkdir -p $PKG_DIR

docker run --rm -v $(pwd):/foo -w /foo lambci/lambda:build-python3.6 \
    pip install -r requirements.txt --no-deps -t $PKG_DIR
    在同一目录下运行以下命令:
chmod +x get_layer_packages.sh

./get_layer_packages.sh

zip -r pandas.zip .

    将图层上传到 S3 存储桶。

    通过运行以下命令将层上传到 AWS:

aws lambda publish-layer-version --layer-name pandas-layer --description "Description of your layer"
--content S3Bucket=<bucket name>,S3Key=<layer-name>.zip
--compatible-runtimes python3.6 python3.7

    转到 Lambda 控制台并将您的代码上传为 zip 文件或使用内联编辑器。

    点击图层 > 添加图层> 从兼容图层中搜索图层(pandas-layer)并选择版本。

    还添加 AWSLambda-Python36-SciPy1x 层,默认情况下可用于导入 numpy。

Selecting the layer from the console

    测试代码。它现在应该可以工作了!!!!

感谢这篇中篇文章https://medium.com/@qtangs/creating-new-aws-lambda-layer-for-python-pandas-library-348b126e9f3e

【讨论】:

【参考方案4】:

AWS Lambda use Amazon Linux 操作系统。想法是下载Pandas 和NumPy 与Amazon Linux 兼容。您使用 pip 下载的内容特定于 Windows 或 Mac。您需要下载适用于 Linux 的兼容版本,以便您的 Lambda 函数能够理解它。这些文件称为wheel 文件。

使用lambda_function.py 文件创建新的本地目录。使用 pip 将 Pandas 安装到本地目录:

$ pip install -t . pandas

导航到https://pypi.org/project/pandas/#files。搜索并下载最新的*manylinux1_x86_64.whl 包。就我而言,我在我的 Lambda 函数上使用 Python 3.6,所以我下载了以下内容:

熊猫 - pandas-0.24.1-cp36-cp36m-manylinux1_x86_64.whl

NumPy - numpy-1.16.1-cp36-cp36m-manylinux1_x86_64.whl

将 whl 文件下载到带有lambda_function.py 的目录。删除 pandasnumpy*.dist-info 目录。解压 whl 文件。

$ rm -r pandas numpy *.dist-info
$ unzip numpy-1.16.1-cp36-cp36m-manylinux1_x86_64.whl
$ unzip pandas-0.24.1-cp36-cp36m-manylinux1_x86_64.whl

删除 whl 文件,*.dist-info__pycache__。准备zip.zip存档:

$ rm -r *.whl *.dist-info __pycache__
$ zip -r zip.zip .

在您的 Lambda 函数中上传 zip.zip 文件。

来源:https://medium.com/@korniichuk/lambda-with-pandas-fd81aa2ff25e

【讨论】:

【参考方案5】:

要在 Lambda 中获取其他库,我们需要在 Amazon Linux 上编译它们(如果底层库是基于 C 或 C++ 的,例如 Numpy,这很重要)并将它们与您想要的 python 脚本一起打包到 ZIP 文件中在 Lambda 中运行。

获取库的 Amazon Linux 编译版本。您可以找到某人已经编译的版本,例如 @pbegle 的版本,或者自己编译。要自己编译,有两种选择: - 在 EC2 实例上编译库 https://streetdatascience.com/2016/11/24/using-numpy-and-pandas-on-aws-lambda/ - 在 Lambda 环境的 docker 版本上编译库 https://serverlesscode.com/post/scikitlearn-with-amazon-linux-container/

在使用 Docker 的最后一个选项之后,可以使用上面博客文章中的说明并添加:

pip install --use-wheel pandas

在脚本中编译库:

https://github.com/ryansb/sklearn-build-lambda/blob/master/build.sh#L21

【讨论】:

我已经尝试过了,但生成的 zip 文件大约为 55MB。有什么更新吗?【参考方案6】:

主要问题是在特定操作系统中编译的库仅适用于该操作系统。所以,如果一个库是在 macOS 中编译的,那么它将不会在 Linux 环境中运行。为什么会出现这个问题?

Pandas 的依赖项之一是 Numpy(由于速度原因编译,see this answer on ***)。 AWS Lambda 使用 Linux,因此如果 Numpy 编译是在 macOS 或 Windows 中完成的,那么编译将只适用于那些特定的架构,而不会在 AWS 中工作。我认为使用 Linux 的人不会遇到这个问题。

要解决此问题并为 Pandas 创建一个有效的 AWS Lambda 层,请执行以下简单步骤 (see the general steps on amazon forum):

mkdir awsPandasLayer #create a directory
cd awsPandasLayer #cd into the directory
pip3 install -t . Pandas #install pandas and all its dependencies 
rm -r pandas numpy *.dist-info __pycache__ #clean up the environment to remove the incompatible numpy and pandas

然后将 Pandas 和 Numpy 的最新预编译包下载到之前创建的 awsPandasLayer 目录中。就我而言,由于我使用的是 Python 3.7,因此我下载了 Pandas 和 Numpy 的这些版本。注意 cp37 表示网站上明确说明的 python 版本。然后如下完成安装:

unzip pandas-1.0.5-cp37-cp37m-manylinux1_x86_64.whl #unzip the pandas precompiled package
unzip numpy-1.18.5-cp37-cp37m-manylinux1_x86_64.whl #unzip the numpy precompiled package
pip3 install -t . openpyxl #I found this is required within AWS Lambda for excel files
rm -r *.whl *.dist-info __pycache__ #clean up unneeded files
zip -r awsPandasLayer.zip . # zip all the files

然后可以将 zip 文件作为 AWS Lambda 层上传,它应该可以工作。请注意,我使用的是 macOS。

【讨论】:

【参考方案7】:

与Cannot find mysql in NodeJS using AWS Lambda略有重复

您需要使用 Lambda 打包您的库。由于 lambda 在公共云上运行,因此您无法对其进行配置。

现在,在您使用 pandas 的情况下,您需要将 Pandas 与您的 zip 打包在一起。获取 pandas 的路径(例如:/Users/dummyUser/anaconda/lib/python3.6/site-packages)并将库复制到您拥有 lambda 函数代码的位置。在您的代码中,请参阅本地副本中的 pandas。上传时,压缩整个集合(代码+库),然后随意上传。它应该可以工作。

【讨论】:

这是我所做的,但它仍然丢失【参考方案8】:

我在这里尝试了一些解决方案,但大多数都不起作用。我喜欢@Ranadeep Guha 建议创建一个容器并在那里下载存储库的想法,这就是我所做的。

我在我的 lambda 函数所在的目录中工作并创建了以下文件:

Docker 文件:

FROM python:3.8-slim
WORKDIR /app
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt -t /app

requirements.txt:(那些是我的)

pandas
numpy
xmltodict

现在在我的 gitbash 中运行以下命令,该命令将为我生成一个安装了所有依赖项的 docker 映像:

docker build -t image_name .

Sending build context to Docker daemon  5.632kB
Step 1/4 : FROM python:3.8-slim
 ---> 56930ef6f6a2
Step 2/4 : WORKDIR /app
 ---> Using cache
 ---> ea0bf539bcad
Step 3/4 : COPY requirements.txt ./
 ---> cb4c005f53cc
Step 4/4 : RUN pip install --no-cache-dir -r requirements.txt -t /app
 ---> Running in a0d179a372b4
Collecting pandas
  Downloading pandas-1.0.3-cp38-cp38-manylinux1_x86_64.whl (10.0 MB)
Collecting numpy
  Downloading numpy-1.18.3-cp38-cp38-manylinux1_x86_64.whl (20.6 MB)
Collecting xmltodict
  Downloading xmltodict-0.12.0-py2.py3-none-any.whl (9.2 kB)
Collecting pytz>=2017.2
  Downloading pytz-2020.1-py2.py3-none-any.whl (510 kB)
Collecting python-dateutil>=2.6.1
  Downloading python_dateutil-2.8.1-py2.py3-none-any.whl (227 kB)
Collecting six>=1.5
  Downloading six-1.14.0-py2.py3-none-any.whl (10 kB)
Installing collected packages: numpy, pytz, six, python-dateutil, pandas, xmltodict
Successfully installed numpy-1.18.3 pandas-1.0.3 python-dateutil-2.8.1 pytz-2020.1 six-1.14.0 xmltodict-0.12.0

现在只需为该映像创建一个 Docker 容器并确认已安装所有内容:

winpty docker run --name container_name -it --entrypoint bash image_name

键入 ls,您将看到所有安装。

现在让我们将所有安装复制到您的本地电脑。您可以将点替换为您电脑上的任何位置:

 docker cp container_id:/app/* . 

【讨论】:

【参考方案9】:

使用来自这些答案和 SO 55695187 的想法,我为 AWS Lambda 构建了一个包含 pandas 的层,并在 github 上提供了它。它具有适用于 Python 3.8 的 pandas v 1.3.1。见https://github.com/eoneil1942/pandas。这是我所做的:

Created an ec2 instance for AWS Linux
Installed python3.8, pip3, used pip3 to install pandas
Made an empty directory python/lib/python3.8/site-packages
Copied pandas and pytz from installed site-packages to this one
zip -r pandas.zip python

显然,这可以推广到任何 Python 包。

【讨论】:

【参考方案10】:

这对我有用:

    在 lambda 代码中仅导入库(不推送 .zip 中的库):

    from scipy.stats import norm

    import pandas as pd

    ...

    然后在 lambda 控制台中,使用 ARN 选项添加层:

    Scipy-numpy: arn:aws:lambda:us-east-1:668099181075:layer:AWSLambda-Python38-SciPy1x:29

    熊猫: arn:aws:lambda:us-east-1:770693421928:layer:Klayers-python38-pandas:42

    测试你的 lambda。

【讨论】:

【参考方案11】:

我在尝试使用 python3.6 引擎时遇到了类似的错误。当我切换到 2.7 时,它对我来说效果很好。我使用 Amazon AMI 创建我的 zip 文件,但它只有 python3.5,而不是 3.6。我想版本不匹配是原因。不过这只是一个猜测,我还没有在python3.6安装上尝试过这个过程。

【讨论】:

【参考方案12】:

使用serverless framework,您可以轻松正确地打包和部署您的依赖项。

你只需要;

    安装无服务器

    npm install -g serverless
    

    在项目的根目录中创建一个 serverless.yml,使用以下内容:

    service: numpy-test
    
    # define the environment of your lambda
    provider:
      name: aws
      runtime: python3.6
    
    # specify the function you want to deploy
    functions:
      numpy:
        # path to your lambda_handler function
        handler: path/to/function.lambda_handler
    
    # add a plugin that allows serverless to package python libraries
    # specified in the requirements.txt or Pipfile
    plugins:
      - serverless-python-requirements
    
    # this section makes sure your libraries get build correctly 
    # for an aws lambda environment
    custom:
      pythonRequirements:
        dockerizePip: non-linux
    

    调整路径/to/function.lambda_handler

    确保 docker 正在运行并执行

    serverless deploy

部署完成后,前往 AWS 控制台查找函数 numpy-test-dev-numpy 并测试您的函数。

this article详细解释了必要的步骤。

【讨论】:

【参考方案13】:

这类似于 Randeep 的回答,但如果您不想这样做,则不需要使用 Lambda 层。

正如其他人所说,这不起作用,因为 pandas/numpy 需要构建二进制文件,并且您的构建机器(Linux、Mac、Windows)的操作系统与 Lambda(Amazon Linux)的操作系统不匹配。

要解决这个问题,您可以使用 docker 下载/构建您的依赖项并将它们打包到 Amazon Linux 上。亚马逊为此提供了一个 Docker 镜像。请参阅下文,了解我如何为 Python 3.6 运行时构建我的 python 包(他们为所有其他运行时提供其他 docker):

将所有依赖项放入requirements.txt 文件中,例如:

openpyxl
boto3
pandas

创建一个脚本(即命名为build.sh)来构建你的包,这是我的样子:

#!/bin/bash

# remove old build artifacts
rm -rf build
rm lambda_package.zip

# make build dir and copy my lambda handler file into it
mkdir build
cp lambda_daily_util_gen.py  build/

# Use requirements file to download/build dependencies into the build folder
cd build
pip install -r ../requirements.txt --target .

# Create an lambda package with my files and all dependencies
zip -r9 ../lambda_package.zip .

确保您已拉取 Amazon Linux lambda 构建映像:

$ docker pull lambci/lambda

在 docker 容器内运行构建脚本:

窗户:

$ docker run --rm -v "$PWD":/var/task lambci/lambda:build-python3.6 /var/task/build.sh

Mac/Linux:

docker run --rm -v $PWD:/var/task lambci/lambda:build-python3.6 chmod +x build.sh;./build.sh

您现在应该会看到一个名为 lambda_package.zip 的文件,该文件是在您可以上传到 AWS 的 Amazon Linux 上构建的。

希望对您有所帮助。

【讨论】:

【参考方案14】:

也许您正在使用的模块适用于 python 2.7。

尝试为 python 3.x 安装 pandas 模块

pip3 安装 pandas -t .

它对我有用。

或者为了即时结果,将运行时更改为 python 2.7 (不推荐)

【讨论】:

【参考方案15】:

要制作与 Lambda 兼容的部署包,请下载一个名为 wheel (.whl) 的预编译包。解压缩 /path/to/project-dir 上的 wheel 文件而不是使用 pip install。

分辨率

    打开您的模块名称 pypi.org 页面。例如: https://pypi.org/project/numpy/

    选择下载文件。

    下载:

对于 Python 2.7,模块名称-版本-cp27-cp27mu-manylinux1_x86_64.whl 对于 Python 3.6,模块名称-版本-cp36-cp36m-manylinux1_x86_64.whl 4.解压/path/to/project-dir文件夹下的wheel文件。

wheel 文件解压后,您的部署包将与 Lambda 兼容。

【讨论】:

【参考方案16】:

这是唯一对我有用的东西:Python packages in AWS Lambda made easy

解释他们做了什么,这是您需要遵循的步骤的一个小摘要:

1 - 在 Linux 实例中安装软件包

与提到的其他用户一样,您需要在 linux 实例中安装库以确保它与您的 Lambda 函数一起使用。您可以使用 AWS Cloud9 服务来执行此操作。

转到 AWS 中的 Cloud9 并单击 创建环境 为环境命名,选择一个 t2.micro 并将其余设置保留为默认设置: 点击下一步查看设置,最后点击创建环境

2 - 创建熊猫图层

在新环境下,使用下面的代码安装panda库(包括numpy):

(注意:你可以安装多个模块)

mkdir folder
cd folder
virtualenv v-env
source ./v-env/bin/activate
pip install pandas
deactivate

键入下一个代码以压缩必要的文件并将图层版本发布到您的 aws 帐户:

mkdir python
cd python
cp -r ../v-env/lib64/python3.7/site-packages/* .
cd ..
zip -r panda_layer.zip python
aws lambda publish-layer-version --layer-name pandas --zip-file fileb://panda_layer.zip --compatible-runtimes python3.7

3 - 将图层添加到您的 lambda

完成第 2 步后,您将在 aws 的 Lambda 部分中拥有一个名为 pandas 的层(您可以在左侧菜单中看到它)。确保您为 lambda 选择了 Runtime 3.7:

在您的 Lambda 配置中单击页面底部的添加层,然后选择您刚刚创建的新层。

您可以通过导入 numpy 和 pandas 来测试 Lambda。你会发现你可以很好地执行它。

最后:

记得删除您的 Cloud9 环境!您可以转到 AWS Cloud9 部分并通过选择它并单击删除来删除之前创建的环境。它应该终止与其关联的 EC2 实例,但要确保,请转到 AWS 中的 EC2 部分并检查实例状态是否为已终止。如果没有,请单击它并在 Instance state 上选择 Terminate instance

请务必查看上述指南以支持他们的工作。

【讨论】:

【参考方案17】:

您的代码总是出现此错误 因为 lambda 不包含任何外部库,它有一个默认情况下随 Python 提供的库。

如果您使用任何外部库,如 pandas、numpy 或任何其他库。您需要在 Aws Lambda 上安装该库 使用前

代码见

import json
print('Loading function')
import pandas as pd
def lambda_handler(event, context):
    return "Welcome to Pandas usage in AWS Lambda"

这里没有安装 pandas 库,因此您的代码无法正常工作。 我的建议是使用您的代码,如下所示。在 lambda 函数中编写所有代码

import json
def lambda_handler(event, context):
    #install python libray here 
    print('Loading function')
    import pandas as pd
    return "Welcome to Pandas usage in AWS Lambda" 

所以最终代码如下所示

 def lambda_handler(event, context):
     import pip

    def install(package):
        if hasattr(pip, 'main'):
            pip.main(['install', package])
        else:
            pip._internal.main(['install', package])

    if __name__ == '__main__':
        install('pandas')

    #install python libray here 
    print('Loading function')
    import pandas as pd
    return "Welcome to Pandas usage in AWS Lambda" 

【讨论】:

以上是关于AWS lambda 中的 Pandas 给出了 numpy 错误的主要内容,如果未能解决你的问题,请参考以下文章

AWS Lambda 网关 API 给出错误消息

将 pandas/scikit-learn 包添加到您的项目以在 AWS lambda 中使用的正确方法是啥

Python Pandas groupby 应用 lambda 参数

如何从账户 A 中的 Lambda(VPC 中的 Lambda)调用账户 B 中的 AWS Lambda 函数(VPC 中的这个 Lambda)

python中的AWS Lambda导入模块错误

AWS Lambda 中的 HTTP 请求