【问题标题】:Architecture to process AWS S3 files处理 AWS S3 文件的架构
【发布时间】:2022-01-05 10:17:57
【问题描述】:

我正在开发一个 POC,其中我们有数百万个现有的 S3 压缩 json 文件(未压缩的 3+ MB,带有嵌套对象和数组),并且每隔几分钟就会添加更多文件。我们需要在未压缩数据(基于每个文件)之上执行计算并将其存储到数据库表中,然后我们可以在其中执行一些列操作。我在网上找到的最常见的解决方案是

S3 (Add/update event notification) => SQS (main queue => dlq queue) <=> AWS lambda

我们为所有成功加载的 S3 存储桶键名创建了一个数据库表,因此我可以查询该表并使用 AWS 开发工具包 Node.js 包将消息发送到 SQS 主队列。对于新添加/更新的文件,S3 事件通知会处理它。

我认为上述架构适用于我的情况,但我应该考虑其他任何 AWS 服务吗?

我查看了 AWS Athena,它可以读取我的压缩文件并给我原始输出,但由于我有大型嵌套对象和数组,我需要在其上执行计算,我不确定编写这样的文件是否理想SQL 中的复杂逻辑。

我真的很感激这里的一些指导。

【问题讨论】:

  • 在不了解输入或输出数据的结构的情况下,如果您需要近乎实时的数据库中的数据,这似乎是一种合理的方法。 SQS 有一个 Lambda 触发器,它允许对 Lambda 的请求进行批处理(最多 10 个),这样有助于减少您尝试预先处理所有遗留数据时可能达到的 Lambda 并发限制。另一种选择可能是使用 AWS Glue,但是,如果您每天(例如)一次批处理数据,而不是在数据到达时连续处理它,这更合适。取决于您的用例。
  • 谢谢@Norman。有效负载结构类似于{ "id": 1, "caseNumber": 1234567890, "accountNumber": 0987654321, "equipmentsUsage": "&lt;Array of objects&gt;", "logs": "&lt;Array of objects&gt;" } 我们将对 equipmentsUsage 内的所有对象(最多 50 个对象)以及 logs 内的所有对象(最多 5000 个)执行计算.输出将是一个包含少量键值对的对象,我们将其添加到数据库中。
  • 数据是否需要(近)实时出现在目的地?
  • @Norman 不,我们不会立即为用户寻找(接近)实时数据,而是希望在用户几分钟后回来时准备好数据。此外,我们可能会向用户发送通知,告知他们的数据指标已准备好接受审核。

标签: amazon-web-services amazon-s3 aws-lambda amazon-sqs amazon-athena


【解决方案1】:

如果您计划在未来以无法预料的方式查询数据,我强烈建议您探索 Athena 解决方案,因为您将在数据之上插入一个非常强大的 SQL 引擎。 Athena 可以直接查询压缩的 json 并导出为其他查询效率更高的数据格式(如 parquet 或 orc)并支持复杂的数据结构。

流程是:

S3 (new file) =&gt; Athena ETL (json to, say, parquet)

参见例如here.

对于已经存在的数据,您可以执行一次性查询以将其转换为适当的格式(如果您的数据量看起来很大,分区将很有用)。良好的分区是在 Athena 上获得良好性能的关键,您需要在 ETL 上仔细考虑它。更多关于分区的信息,例如,there

【讨论】:

    猜你喜欢
    • 2020-01-01
    • 2017-01-10
    • 2020-05-14
    • 2019-03-08
    • 1970-01-01
    • 2022-01-24
    • 2017-05-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多