11

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

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

  1. fastparquet with s3fs:不幸的是,解压后的包大小超过 256MB,因此我无法用它更新 Lambda 代码。
  2. 带有 s3fs 的 pyarrow:我关注了https://github.com/apache/arrow/pull/916,当使用 lambda 函数执行时,我得到:

    • 如果我在 URI 前加上 S3 或 S3N(如代码示例中所示):在 Lambda 环境OSError: Passed non-file path: s3://mybucket/path/to/myfile中的 pyarrow/parquet.py,第 848 行。在本地,我进入IndexError: list index out of rangepyarrow/parquet.py,第 714 行
    • 如果我不使用 S3 或 S3N 作为 URI 前缀:它在本地工作(我可以读取镶木地板数据)。在 Lambda 环境中,我OSError: Passed non-file path: s3://mybucket/path/to/myfile在 pyarrow/parquet.py 的第 848 行中得到了相同的结果。

我的问题是:

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

谢谢!

4

4 回答 4

7

AWS 有一个项目 ( AWS Data Wrangler ),允许它完全支持 Lambda 层。

在文档中有一步一步来做。

代码示例:

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://...")

参考

于 2020-01-10T13:47:41.217 回答
3

我能够使用 fastparquet 将 parquet 文件写入 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 的 zip 文件和解压缩文件大于 260M 的文件。如果有人知道将依赖项导入 Lambda 的更好方法,请分享。

资料来源: 将镶木地板从 AWS Kinesis firehose 写入 AWS S3

于 2018-06-08T19:57:55.120 回答
2

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

于 2017-12-27T15:32:21.770 回答
0

也可以通过AWS sam cli和 Docker 来实现这一点(我们稍后会解释这个要求)。

1.创建目录并初始化sam

mkdir some_module_layer
cd some_module_layer
sam init

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

1 - AWS 快速入门模板

8 - 蟒蛇 3.7

项目名称 [sam-app]: some_module_layer

1 - Hello World 示例

2.修改requirements.txt文件

cd some_module_layer
vim hello_world/requirements.txt

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

3.将pyarrow添加到requirements.txt

除了 pyarrow 之外,它还可以包含附加pandass3fs. 在这种情况下,包括 pandas 将避免它无法识别pyarrow为读取镶木地板文件的引擎。

pandas
pyarrow
s3fs

4. 使用容器构建

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

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

以下链接对此很有用。

于 2020-06-02T01:52:18.087 回答