我正在尝试使用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并测试它
似乎有两种可能的方法, which both work locally to the docker container :
带有s3fs的
-
fastparquet:不幸的是,包的解压缩大小超过256MB,因此无法用它更新Lambda代码 .
带有s3fs的 -
pyarrow:我跟着https://github.com/apache/arrow/pull/916,当用lambda函数执行时,我得到:
-
如果我在URI前加上S3或S3N(如代码示例所示):在pyarrow / parquet.py中的Lambda环境
OSError: Passed non-file path: s3://mybucket/path/to/myfile
,第848行 . 我在pyarrow / parquet.py,第714行获得了IndexError: list index out of range
-
如果我没有为S3或S3N添加URI前缀:它在本地工作(我可以读取镶木地板数据) . 在Lambda环境中,我在pyarrow / parquet.py,第848行得到了相同的
OSError: Passed non-file path: s3://mybucket/path/to/myfile
.
我的问题是:
-
为什么我的docker容器中的结果与Lambda环境中的结果不同?
-
提供URI的正确方法是什么?
-
有一种可以通过AWS Lambda读取S3中的Parquet文件的方法吗?
谢谢!
2 回答
这是一个环境问题(VPC中的Lambda无法访问存储桶) . Pyarrow现在正在工作 .
希望问题本身能够对如何使所有工作提供足够好的概述 .
我能够使用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不适用于开发 . 这是我寻找包的方式:
我安装了:
2.使用此处的说明构建一个zip文件,其中包含我的脚本将使用的所有依赖项,并将它们全部转储到一个文件夹中,并使用以下命令压缩它们:
注意:我必须解决一些限制:Lambda不允许您上传更大的50M拉链并解压缩> 260M . 如果有人知道更好的方法来获取Lambda的依赖,请分享 .
资料来源:Write parquet from AWS Kinesis firehose to AWS S3