使用AWS Lambda读取存储在S3中的Parquet文件(Python 3)

我正在尝试使用AWS Lambda在S3中加载,处理和编写Parquet文件.我的测试/部署过程是:

> https://github.com/lambci/docker-lambda作为模拟Amazon环境的容器,因为需要安装本机库(numpy等).
>此过程生成一个zip文件:http://docs.aws.amazon.com/lambda/latest/dg/with-s3-example-deployment-pkg.html#with-s3-example-deployment-pkg-python
>将一个测试python函数添加到zip,将其发送到S3,更新lambda并测试它

似乎有两种可能的方法,它们都在本地工作到docker容器:

>带有s3fs的fastparquet:不幸的是,包的解压缩大小超过256MB,因此无法用它更新Lambda代码.
>带有s3fs的pyarrow:我跟着https://github.com/apache/arrow/pull/916,当用lambda函数执行时,我得到:

>如果我在URI前加上S3或S3N(如代码示例所示):在Lambda环境中OSError:传递非文件路径:s3:// mybucket / path / to / myfile in pyarrow / parquet.py,第848行.本地我在pyarrow / parquet.py第714行得到IndexError:list index超出范围
>如果我没有用S3或S3N作为URI的前缀:它在本地工作(我可以读取镶木地板数据).在Lambda环境中,我得到相同的OSError:传递非文件路径:s3:// mybucket / path / to / myfile in pyarrow / parquet.py,第848行.

我的问题是:

>为什么我的docker容器中的结果与Lambda环境中的结果不同?
>提供URI的正确方法是什么?
>有没有可以通过AWS Lambda在S3中读取Parquet文件的方法?

谢谢!

最佳答案
我能够使用fastparquet将镶木地板文件写入S3.这有点棘手,但是当我意识到将所有依赖项组合在一起时,我必须使用与Lambda正在使用的完全相同的Linux.

我是这样做的:

1.使用与Lambda一起使用的Amazon Linux映像启动EC2实例

资源:
https://docs.aws.amazon.com/lambda/latest/dg/current-supported-versions.html

Linux图片:
https://console.aws.amazon.com/ec2/v2/home#Images:visibility=public-images;search=amzn-ami-hvm-2017.03.1.20170812-x86_64-gp2

注意:您可能需要安装许多软件包并将python版本更改为3.6,因为此Linux不适用于开发.这是我寻找包的方式:

sudo yum list | grep python3

我安装了:

python36.x86_64
python36-devel.x86_64
python36-libs.x86_64
python36-pip.noarch
python36-setuptools.noarch
python36-tools.x86_64

2.使用此处的说明构建一个zip文件,其中包含我的脚本将使用的所有依赖项,并将它们全部转储到一个文件夹中,并使用以下命令压缩它们:

mkdir parquet
cd parquet
pip install -t . fastparquet 
pip install -t . (any other dependencies)
copy my python file in this folder
zip and upload into Lambda

注意:我必须解决一些限制:Lambda不允许您上传更大的50M拉链并解压缩> 260M.如果有人知道更好的方法来获取Lambda的依赖,请分享.

资源:
Write parquet from AWS Kinesis firehose to AWS S3

转载注明原文:使用AWS Lambda读取存储在S3中的Parquet文件(Python 3) - 代码日志