【问题标题】:"Fork and Join" with serverless functions (e.g. AWS Lambda) / Python使用无服务器功能(例如 AWS Lambda)/Python 进行“分叉和加入”
【发布时间】:2019-03-19 02:42:33
【问题描述】:

我正在使用 AWS Lambda (https://registry.opendata.aws/sentinel-2/) 处理相对较大的图像。

为了处理这些图像,我将它们分成更小的图像(约 1500 个“芯片”),这些图像可以独立处理(芯片的数量会根据源图像的内容发生不可预测的变化)。使用 Lambda 的多次调用并行处理芯片,该 Lambda 接收数百芯片的“页面”。

这就是我卡住的地方:当所有页面都处理完毕后,我需要将结果合并到一个输出图像中,但是如何知道所有页面(“可变调用批次”)何时完成?

我考虑过例如将进度信息写入 s3 或 dynamo 并在每个页面之后调用组合函数,以便只有该函数的最后一次调用继续进行(当进度检查返回完成时)。我见过期货/承诺之类的选项,但一页筹码的处理时间约为 10-15 分钟,所以我不想让“控制器”功能等待期货/承诺完成,因为那时进行多次调用会更便宜。

有没有更好的解决方案,写出进度信息并多次检查?

(注意我看过这个问题:Fork and Join with Amazon Lambda

【问题讨论】:

    标签: python amazon-web-services aws-lambda


    【解决方案1】:

    您可以使用 Amazon SQS 将芯片添加到队列中,并让工作人员或 Lambda 将这些单独的作业从队列中拉出。然后,您可以使用 cloudwatch 警报设置来监控队列的深度,其中队列深度为零(作业已完成)会触发“完成”Lambda,它将各个输出芯片重新组合在一起。

    我相信 CloudWatch 每隔 5 分钟会提醒轮询队列状态,因此对于处理时间较长(约 10-15 分钟)的用例,这不会是这里的瓶颈(Lambda 超时无论如何都是 15 分钟) ,因此如果您设置在 15 分钟轮询,您的 Lambda 要么失败,要么届时将完成)。

    一步一步,这会是什么样子:

    1. 将新文件上传到 S3
    2. 上传触发 lambda 以将文件分解为新文件夹中的“芯片”
    3. 将所有筹码添加到新队列
    4. Lambdas 从队列中拉出筹码
    5. 当队列为空时,触发聚合 lambda

    这是另一个关于根据队列状态设置触发器的有用答案:Efficient way to check whether SQS queue is empty

    【讨论】:

    • 我认为这可行。我有几个问题要问我。如果大约在同一时间请求两个不同的文件,大概需要两个不同的队列和消费 Lambda 的更新触发器?其次,如果 Cloudmwatch 触发器恰好在最后一条芯片消息被消耗后降落,但在芯片完成处理之前,我认为有可能丢失芯片?我可以看到后者是通过在触发聚合之前等待或计算至少两个“空队列”轮询的设计来解决的。
    猜你喜欢
    • 2023-04-01
    • 1970-01-01
    • 2021-06-03
    • 2020-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-24
    • 2019-06-19
    相关资源
    最近更新 更多