【问题标题】:Processing rather big text files on serverless AWS在无服务器 AWS 上处理相当大的文本文件
【发布时间】:2018-08-10 22:56:12
【问题描述】:

我正在尝试找出一种架构,用于在无服务器 AWS 上处理相当大的文件(可能几百 MB)。这是我到目前为止所得到的:

API Gateway -> S3 -> Lambda function -> SNS -> Lambda function

在本场景中,文本文件通过 API Gateway 上传到 S3。然后根据 S3 上生成的事件调用一些 Lambda 函数。此 Lambda 函数将打开文本文件并逐行读取,生成要在 SNS 主题中作为消息完成的任务。每条消息都会调用一个单独的 Lambda 函数来处理该任务。

我唯一关心的是第一个 Lambda 函数调用。如果超时怎么办?如何确保它不是故障点?

【问题讨论】:

  • 文件的格式是什么? JSON? CSV?
  • 你可以说 CSV,但它更像是自定义格式。可以肯定地说您可以逐行阅读它们。

标签: amazon-web-services aws-lambda


【解决方案1】:

您可以要求 S3 仅返回给定对象的特定字节范围,使用 Range 标头:https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectGET.html

例如:

Range: bytes=0-9

将只返回 S3 对象的前 10 个字节。

要逐行读取文件,您必须确定特定的块大小(例如 1 MB),一次读取 1 个文件块并逐行拆分块(通过查找换行符) .读取整个块后,您可以重新调用 lambda 并将块指针作为参数传递。 lambda 的新调用将从作为参数给出的块指针中读取文件。

【讨论】:

    【解决方案2】:

    首先要知道的是,可用的 Lambda CPU 与其配置的 RAM 大小成正比。所以,双倍的 RAM 可以让你的 CPU 翻倍。

    如果按比例放大 Lambda 不能做到这一点......那么一些餐巾纸的想法:

    1. 一个工作流程可能是:如果 CSV 的大小小于 X(待确定) 然后在单个 Lambda 中处理。如果大小大于 X 则调用 N sub-lambdas,将它们分别指向输入文件的 1/N (假设您可以像这样拆分工作量)。 Lambda 使用 S3 的获取范围功能。这是一种 map/reduce 模式。

    2. 或者可以使用 Step Functions。开始第一次 Lambda 调用 处理文件,跟踪剩余时间(可用 来自上下文对象),并响应 Step Functions 以指示 它走了多远。然后 Step Functions 调用后续 Lambda 以 处理文件的下一部分,依此类推,直到完成。

    3. 或者使用 EC2、容器,甚至 EMR(显然不是无服务器)。

    另外,请注意 Lambda 函数具有 limited diskspace (500MB),因此如果您需要将文件下载到磁盘以进行处理,那么它需要小于 500MB,尽管您可能需要使用任何其他磁盘空间.或者,您可以通过简单地将文件读入内存(并根据需要将 Lambda 函数的大小调整为 3GB)来解决此磁盘空间限制。

    【讨论】:

    • 如果文件大于 500mb,你也可以给 lambda 大量的 RAM 并将文件存储在内存中
    • @cementblocks 你是对的,这是一个重要的澄清,所以我会更新我的答案。谢谢。
    【解决方案3】:

    您可以使用 AWS Batch 而不是 lambda 来处理繁重的东西。

    1. 使用您的代码创建 docker 容器,将其加载到 ECS,然后创建作业定义来运行它。

    2. 使用 lambda 以输入文件作为参数提交此作业。

    3. op1:在第二阶段处理中创建相关作业,当第一个作业成功时将自动午餐。 op2:使用step函数编排所有场景(注意step函数和Batch的集成并不理想..)

    【讨论】:

      猜你喜欢
      • 2012-03-09
      • 2012-04-25
      • 1970-01-01
      • 1970-01-01
      • 2018-11-04
      • 1970-01-01
      • 2015-03-29
      • 1970-01-01
      • 2015-11-03
      相关资源
      最近更新 更多