首页 文章

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

提问于
浏览
3

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

似乎有两种可能的方法, 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 回答

  • 2

    这是一个环境问题(VPC中的Lambda无法访问存储桶) . Pyarrow现在正在工作 .
    希望问题本身能够对如何使所有工作提供足够好的概述 .

  • 1

    我能够使用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

相关问题