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.py
、numpy
目录和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
的目录。删除 pandas
、numpy
和 *.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 错误的主要内容,如果未能解决你的问题,请参考以下文章
将 pandas/scikit-learn 包添加到您的项目以在 AWS lambda 中使用的正确方法是啥
Python Pandas groupby 应用 lambda 参数
如何从账户 A 中的 Lambda(VPC 中的 Lambda)调用账户 B 中的 AWS Lambda 函数(VPC 中的这个 Lambda)