【问题标题】:Sturdy serverless ETL flow in AWSAWS 中强大的无服务器 ETL 流
【发布时间】:2020-01-18 03:40:49
【问题描述】:

我正在尝试构建一个强大的 AWS 无服务器 ETL 流,以将 (CSV) 文件从 S3 存储桶加载到 Postgres 实例 (postgresql9.6)。这些文件相当大(10gb+),所以在测试时我遇到了 Lambda 的多个限制(/tmp 空间、内存空间、时间)。

我正在研究 AWS Glue,但感觉这可能对 RDS 有限制,并且对于我正在尝试做的事情来说有点矫枉过正。

此外,CSV 文件包含 Postgres COPY FROM 无法处理的多字符分隔符(“~|~”)(因此,我还需要进行一些预处理)。

有没有人遇到过类似情况并设法做到无服务器,或者我应该坚持使用 EC2 实例以了解情况?

【问题讨论】:

    标签: amazon-web-services aws-lambda serverless aws-glue


    【解决方案1】:

    AWS Glue 是此类任务的不错选择,它对带有 JDBC 的 RDS 有很好的支持。您可以采取的步骤:

    1. 使用 Glue 爬虫推断 S3 文件的架构并将其保存到 Glue 表中。
    2. 创建到 RDS 的连接
    3. 使用向导启动 Glue 作业,使用 Glue 表作为源,使用 postgres 作为目标。

    如果是标准转换,Glue 可以即时生成脚本,您可能不需要编写任何代码。这对我来说是一次很酷的体验。

    【讨论】:

    • 感谢您的指点。但是,胶水爬虫不允许我指定多字符分隔符(不支持 MultiDelimitSerDe)。现在,我正在尝试加载 S3 文件,并将分隔符更改为单个字符分隔符到另一个 S3 文件。然后我将该 S3 文件加载到 RDS。让我烦恼的是冷启动需要很长时间(大约 15 分钟)。
    • 同意,冷启动时间太长了。
    【解决方案2】:

    我在处理大文件和 Lambda 时也遇到过问题,只是不灵活,对计算环境的控制不够。

    我有一个类似的解决方案草图,基本上是两个 lambda:

    Lambda_1 的工作是检查 S3 对象,确定大小,并使用 ByteRangeStartByteRangeEnd 迭代地执行 S3 GetObject 和块。 (See here.) 这个 lambda 表达式需要处理文件的中线分割。对于它标识要处理的每一完整行,它调用...

    Lambda_2:您的所有逻辑和数据库调用,但采用了更好的一次一行模式。

    更新:就效率而言,您可能希望在以“n”行作为参数调用第二个 Lambda 之前在 Lambda_1 中聚合“n”行。为了最大限度地减少 lambda 时间 ($),并在 Lambda_2 中执行许多数据库插入/更新以避免那里的开销。

    【讨论】:

    • 谢谢,我还没用过ByteRangeStart和ByteRangeEnd,我去研究一下。
    • ByteRange*,你只需要在你的第一个 Lambda 中构造一个 SOAP 请求,不确定是否有一些库可以轻松做到这一点。并忘记了多字符分隔符方面,但上述内容仍应满足这一点,您可以烘焙任何自定义程序来解析数据。祝你好运!
    猜你喜欢
    • 2017-11-05
    • 2018-02-20
    • 1970-01-01
    • 2020-03-04
    • 1970-01-01
    • 2017-07-09
    • 1970-01-01
    • 2016-04-29
    • 1970-01-01
    相关资源
    最近更新 更多