AWS lambda中的Pandas出现numpy错误

时间:2017-05-09 18:48:57

标签: python pandas numpy amazon-s3 aws-lambda

我一直在尝试在导入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"
  1. 我已将此python文件与numpy,pandas和pytz库一起压缩为部署包(在Amazon EC2 linux机器中完成所有这些)
  2. 然后将包上传到S3
  3. 创建了一个lambda函数(runtime = python3.6)并从S3
  4. 上传了部署包

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

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

    我在压缩包中已经有了numpy,但我仍然收到此错误。我试着按照Pandas & AWS Lambda给出的提示,但没有运气。

    有没有人遇到过同样的问题。非常感谢任何提示或建议来解决这个问题。

    由于

14 个答案:

答案 0 :(得分:7)

编辑:我终于想出了如何运行熊猫和熊猫在AWS Lambda python 3.6运行时环境中使用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。

ORIGINAL:

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

答案 1 :(得分:3)

要在您的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为例来解释说明:

  1. 在pypi.org上打开模块页面。 https://pypi.org/project/numpy/
  2. 选择下载文件。

  3. 下载:

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

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

对于Python 3.6,module-name-version-cp36-cp36m-manylinux1_x86_64.whl

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

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

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

未压缩wheel文件时,您的部署包将与Lambda兼容。

希望这一切都说得通;)

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

What it might look like

答案 2 :(得分:2)

要在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/上编译库   - 在Docker版本的Lambda环境中编译库 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

答案 3 :(得分:2)

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

创建或打开干净目录,然后执行以下步骤:

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

  1. 使用以下命令创建 requirements.txt 文件:
pandas==0.23.4
pytz==2018.7
  1. 使用以下命令创建 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}
  1. 在同一目录中运行以下命令:
chmod +x get_layer_packages.sh

./get_layer_packages.sh

zip -r pandas.zip .
  1. 将图层上传到S3存储桶。

  2. 通过运行以下命令将层上传到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
  1. 转到Lambda控制台并以zip文件形式上传代码或使用内联编辑器。

  2. 单击“图层”>“添加图层”>从“兼容”图层中搜索该图层(pandas图层),然后选择版本。

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

Selecting the layer from the console

  1. 测试代码。现在应该可以使用了!!!!

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

答案 4 :(得分:1)

略微复制Cannot find MySQL in NodeJS using AWS Lambda

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

现在在你的情况下,当你使用熊猫时,你需要用你的拉链包装Pandas。获取pandas的路径(例如:/Users/dummyUser/anaconda/lib/python3.6/site-packages)并将库复制到您拥有lambda函数代码的位置。在您的代码中,请参阅本地副本中的pandas。上传时,压缩整套(代码+库),然后上传。它应该工作。

答案 5 :(得分:1)

AWS Lambda use Amazon Linux操作系统。想法是与Pandas兼容的下载NumPyAmazon 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,因此我下载了以下代码:

使用lambda_function.py将whl文件下载到目录。删除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

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

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

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

enter image description here

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

答案 6 :(得分:1)

我在这里尝试了一些解决方案,但大多数都没有用。我喜欢@Ranadeep Guha提出的创建contaienr并在那儿下载存储库的想法,这就是我所做的。

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

Dockerfile:

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,您将看到所有安装。

现在,将所有安装复制到本地PC上: 您可以将点替换为PC上的任何位置

 docker cp container_id:/app/* . 

答案 7 :(得分:1)

主要问题是,在特定操作系统中编译的库仅适用于该操作系统。因此,如果库是在macOS内编译的,则它将无法在Linux环境中运行。为什么这是个问题?

Pandas的依赖项之一是Numpy(由于速度see this answer on stackoverflow而被编译)。 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

然后将PandasNumpy的最新预编译软件包下载到先前创建的awsPandasLayer目录中。就我而言,由于我使用的是Python 3.7,因此我下载了这些版本的PandasNumpy。注意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。

答案 8 :(得分:1)

使用这些答案和 SO 55695187 中的想法,我为包含熊猫的 AWS Lambda 构建了一个层,并在 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 包。

答案 9 :(得分:0)

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

答案 10 :(得分:0)

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

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

要解决此问题,您可以使用docker下载/构建您的依赖项并将其打包在Amazon Linux上。 Amazon为此提供了一个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容器中运行构建脚本:

Mac / Linux:

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

Windows:

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

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

希望有帮助。

答案 11 :(得分:0)

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

您只需要;

  1. 安装无服务器

    [US 2!]
    
  2. 在项目的根目录中使用以下命令创建一个serverless.yml:

    npm install -g serverless
    
      

    调整路径/到/function.lambda_handler

  3. 确保docker正在运行并执行

    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

部署完成后,转到AWS控制台查找功能 numpy-test-dev-numpy 并测试您的功能。

this article详细说明了必要的步骤。

答案 12 :(得分:0)

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

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

pip3安装pandas -t。

对我有用。

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

答案 13 :(得分:0)

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

分辨率

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

  2. 选择下载文件。

  3. 下载:

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

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