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

时间:2017-12-26 22:22:34

标签: python amazon-s3 aws-lambda parquet pyarrow

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

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

  1. 使用s3fs的fastparquet:不幸的是,包的解压缩大小超过256MB,因此无法用它更新Lambda代码。
  2. 带有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行。我在本地获取{ {1}}在pyarrow / parquet.py,第714行
    • 如果我不在URI前加上S3或S3N :它在本地工作(我可以读取镶木地板数据)。在Lambda环境中,我在pyarrow / parquet.py,第848行得到了相同的IndexError: list index out of range
  3. 我的问题是:

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

    谢谢!

4 个答案:

答案 0 :(得分:5)

AWS有一个项目(AWS Data Wrangler),该项目允许其完全支持Lambda Layers。

在文档中有一个step-by-step可以完成。

代码示例:

import awswrangler as wr

# Write
wr.s3.to_parquet(
    dataframe=df,
    path="s3://...",
    dataset=True,
    database="my_database",  # Optional, only with you want it available on Athena/Glue Catalog
    table="my_table",
    partition_cols=["PARTITION_COL_NAME"])

# READ
df = wr.s3.read_parquet(path="s3://...")

Reference

答案 1 :(得分:3)

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

答案 2 :(得分:2)

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

答案 3 :(得分:0)

一个人也可以通过AWS sam cli和Docker实现这一点(我们将在后面解释这一要求)。

1。创建目录并初始化sam

mkdir some_module_layer
cd some_module_layer
sam init

通过键入最后一个命令,将提示一系列三个问题。可以选择以下一系列答案(我正在考虑在Python3.7下工作,但其他选择也是可行的)。

1-AWS快速入门模板

8-Python 3.7

项目名称[sam-app]:some_module_layer

1-Hello World示例

2。修改requirements.txt文件

cd some_module_layer
vim hello_world/requirements.txt

这将在vim上打开requirements.txt文件,在Windows上,您可以键入code hello_world/requirements.txt来在Visual Studio Code中编辑该文件。

3。将pyarrow添加到requirements.txt

沿着pyarrow,它将包括另外的pandass3fs。在这种情况下,包括熊猫将避免它不会将pyarrow识别为读取镶木地板文件的引擎。

pandas
pyarrow
s3fs

4。用容器构建

运行--use-container命令时,要求Docker使用选项sam build。如果是第一次,它将拉出lambci/lambda:build-python3.7 Docker映像。

sam build --use-container
rm .aws-sam/build/HelloWorldFunction/app.py
rm .aws-sam/build/HelloWorldFunction/__init__.py
rm .aws-sam/build/HelloWorldFunction/requirements.txt

请注意,我们仅保留python库。

5。压缩文件

cp -r .aws-sam/build/HelloWorldFunction/ python/
zip -r some_module_layer.zip python/

在Windows上,可以运行 Compress-Archive python/ some_module_layer.zip

6。将zip文件上传到AWS

以下link对此很有用。