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个回答

2
我的解决方案是维护两个要求.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 synthcdk deploy \* --profile profile_name

如果有帮助的话,我的 provided_linux_installs.txt 文件看起来像这样:

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

有趣的解决方案,为什么在第二个 pip 调用中使用 "--no-deps"?我猜想如果您使用的某些内容具有其他依赖项,这样做可能是不正确的? - Jimbo
1
刚刚运行了这段代码,得到了这个好消息…… “当使用--python-version、--platform、--abi或--implementation限制平台和解释器的约束时,必须设置--no-deps,或者设置--only-binary=:all:并且不设置--no-binary(或必须将其设置为:none:)。 - Jimbo
2
@Jimbo,你说得对。说实话,我不是完全记得了,但我认为我必须做一两轮的错误消息来确保我在其中一个要求文件中拥有所有依赖项(其中一个显著的是pytz,它还需要作为Linux版本进行加载)。 - Scott Brenstuhl

1

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 库(import pandas as 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:\Users\YourUser\Desktop。
  4. 运行上述步骤 4-6。

*对于上述第3点:您需要获取您的EC2 IP并插入它。如果您看到有关pem文件权限的错误,则需要右键单击pem文件>属性>安全>高级>禁用继承,并确保只有您的用户在“权限条目”中。最后,修复路径以指向pandas.zip文件在EC2实例上的位置以及您希望该文件最终出现的本地位置。

**注意lambda函数的Python运行时。确保它与您用于进行pip操作的Python版本相匹配(应为3.8)。

***原始文件夹名称“python”之所以被命名为这个名称,是根据AWS文档的规定。


1
# 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层。

0
最简单的方法是通过AWS添加预定义的层提供程序来完成。从控制台打开您的函数,然后按照以下步骤操作:
  1. 转到“层” -> “添加层”
  2. 在“层来源”下选择“AWS层”
  3. 选择带有正确Python版本后缀的“AWSSDKPandas-Python3”
  4. 选择预定义的层版本,然后点击“添加”

0

0

经过大量的搜索和尝试,我发现层的概念非常好,而且对我很有效。

这个来自keithrozario的github仓库有很多预构建的层,你可以通过ARN简单地将它们添加到你的Lambda中,里面有一些很棒的东西,比如pandas、requests和sqlalchemy。

我创建了一个模板,使用AWS CLI编译和上传一个包含Python依赖项的层到Lambda,你可以在我的Gitlab仓库中找到它。

我在Amazon Linux EC2上运行这个程序,使用虚拟环境(venv)从requirements.txt文件安装库,然后使用AWS CLI加载压缩文件到Lambda。

请注意,文件夹结构my_zip_file/python/binaries是Lambda所必需的。

注意:Pandas是一个相当大的库。你的压缩层文件必须小于70MB。

你可能还会遇到可怕的"OpenBLAS WARNING - could not determine the L2 cache size on this system"错误消息。我不得不增加内存,从默认的128MB才能使Lambda成功运行。


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