在无服务器AWS上处理相当大的文本文件

时间:2018-03-02 17:06:47

标签: amazon-web-services aws-lambda

我试图在无服务器的AWS上找出处理相当大的文件(可能只有几百MB)的架构。这是我到目前为止所得到的:

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

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

我唯一关心的是第一个Lambda函数调用。如果它超时怎么办?我怎样才能确保它不是一个失败点?

3 个答案:

答案 0 :(得分:2)

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

例如:

Range: bytes=0-9

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

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

答案 1 :(得分:0)

首先要知道的是,可用的Lambda CPU与其配置的RAM大小成正比。因此,RAM加倍可以使CPU加倍。

如果放大Lambda不会这样做...那么一些餐巾纸的想法:

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

  2. 或者也许使用步骤功能。开始第一次Lambda调用 处理文件,跟踪剩余时间(可用 从上下文对象),并响应步骤函数来指示 它到底有多远。然后Step Functions调用后续的Lambda 处理文件的下一部分,依此类推,直至完成。

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

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

答案 2 :(得分:0)

您可以使用AWS Batch代替lambda来处理繁重的事情。

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

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

  3. op1:创建第二阶段处理的依赖作业,当第一个作业成功时自动进行午餐。 op2:使用步骤函数来编排所有场景(注意步骤函数和Batch之间的集成并不理想..)