如何合并一些Lambda函数调用的输出

时间:2018-06-15 19:22:32

标签: amazon-web-services aws-lambda

我有一个大文件,我想在AWS中使用Lambda函数进行处理。由于我无法控制文件的大小,我想出了将文件处理分配给多个lambda函数调用的解决方案,以避免超时。以下是它的工作原理:

  1. 我专门用一个桶来接受要处理的新输入文件。
  2. 我在每次上传新文件时都会在存储桶上设置触发器(让我们称之为uploadHandler
  3. 读取文件,uploadHandler测量文件的大小并将其分成相等的块。
  4. 每个块都被发送到processor lambda函数进行处理。
  5. 注意:

    • uploadHandler 读取文件内容。
    • 发送至processor的数据仅为{ start: #, end: # }
    • 并行调用processor的多个实例。
    • 每个processor调用分别读取其自己的文件块并为其生成输出。

    到目前为止一切顺利。问题是如何将所有processor调用的输出合并为一个输出?有没有人有任何建议?以及如何知道所有processor s的执行何时完成?

2 个答案:

答案 0 :(得分:2)

我最近遇到了类似的问题。我使用此解决方案https://docs.aws.amazon.com/step-functions/latest/dg/tutorial-create-iterate-pattern-section.html

使用AWS lambda和Step函数解决它

在这个具体的例子中,执行并不是在并行中发生的,而是它的顺序执行。但是当状态机完成执行时,您可以确保文件已完全正确处理。我不知道你的样子是否正好。

答案 1 :(得分:2)

选项1:

  1. 中断文件后,让uploadHandler函数同步调用processor函数。
  2. 同时进行调用,以便您可以立即触发所有processors。 Lambda函数只有一个vCPU(如果RAM> 1,800 Gb,则为2个vCPU),但请求是IO绑定的,因此您只需要一个处理器。
  3. uploadHandler将等待所有processors回复,然后您可以汇总所有回复。
  4. 优点:实施起来更简单,没有存储空间;

    缺点:在所有内容完成之前,无法查看正在发生的事情;

    选项2:

    1. 在数据库中保留processingJob(RDS,DynamoDB,等等)。 uploadHandler将创建作业并保存文件被分解的部分数量。使用每个文件部分保存作业ID。
    2. 每个processor获取一个部分(带有作业ID),处理它,然后在DB中存储处理结果。
    3. 让每个processor检查是否是最后一个提供结果的人;如果是,则使其触发assembler函数以收集所有结果并执行您需要的任何操作。
    4. 优点:更高的可见性,因为您可以随时查询您的存储数据库,以检查哪些部分已处理,哪些部分待处理;如果需要,您可以存储processor中的各种元数据进行详细分析;

      缺点:需要存储服务和稍微复杂的Lambdas处理;