Amazon Lambda 是否适合每天并行计算数百份报告?
Would Amazon Lambda Be Suitable for Computing Hundreds of Reports a Day in Parallel?
我的现状:
我目前有一个 Python 脚本,它通过 HTTP 端点获取数据并每天计算和生成 hundreds/thousands 报告。目前,它 运行 在 AWS EC2 实例上运行,其中队列用于拆分需要跨四个线程生成的报告。一次四个,脚本获取数据,计算每个报告,并将其保存到 PostgreSQL Amazon RDS。
问题:
随着项目规模的扩大,我的脚本将无法足够快地计算,并且无法使用当前方法在一天内生成所需的所有报告。
寻找解决方案:
我偶然发现了 Amazon Lambda,但我还没有发现任何人将它用于与我类似的用例。我的计划是 upload/put 每个报告都需要生成到它自己的 S3 存储桶中,然后在创建存储桶时触发 Lambda 函数。 Lambda 函数将执行所有数据提取(从 HTTP 端点)和所有计算并将其保存到我的 PostgreSQL Amazon RDS 中的一行。从理论上讲,这将使一切并行,并消除等待资源被释放的队列的需要。
基本上,我正在寻找一种解决方案,以确保我的脚本能够每天 运行 并每天完成而不会过度 运行 进入第二天。
我的问题:
Amazon Lambda 适合做这样的事情吗?
用 Amazon Lambda 做这样的事情(每天创建 hundreds/thousands 个 s3 存储桶)成本高吗?
还有更好的选择吗?
非常感谢任何帮助、建议、见解或技巧。谢谢!
Would Amazon Lambda be suitable for something like this?
- 您不能 运行 超过 5 分钟。
- 部署(尤其是当你有很多外部库时)有点笨拙
- 您几乎无法控制 AWS 运行 如何处理您的代码(可能会有延迟或暂停,日志更难获取)
如果这些不是您的严重问题,我认为您的问题听起来很合适。
Would it be costly to do something like this with Amazon Lambda (creating hundreds/thousands of s3 buckets a day)?
参见Lambda Pricing and S3 Pricing。
每天创建数千个存储桶听起来不是个好主意(而且 AWS 可能不允许)。默认情况下,您的账户中可以有 100 个存储桶,每个存储桶名称都是全局的(针对该区域)。也许您的意思是一个存储桶中包含数千个密钥?
这一切都取决于您的报告大小、创建报告所需的时间和内存,以及从 AWS 获取报告的频率(即您为数据传输付费的时间)。 AWS 有一个 cost calculator 虽然有点麻烦,所以您可能更愿意自己从他们的定价页面上弄清楚。
Is there better options?
如果您的报告几乎不断生成,您最好继续自己 运行 服务器。如果您偶尔获得非常大的批量,您最好竞标现货实例或寻找其他云服务提供商。如果您一整天都没有规律地爆发,那么 Lambda 似乎非常适合您。
@Nathaniel 已经回答了大部分问题,但我要补充 "other options" 点:
如果从源的角度来看,您可以 运行 多于四个并行报告(由于 CPU 利用率,您只是将它们限制为四个,而不是因为 HTTP 服务无法处理更高的负载)然后我肯定会说你可以做更多的事情:
重写您的报告以使用 async IO 以便您可以利用 HTTP 请求被阻止的时间。这可以提高您的吞吐量。
获取具有更多 CPU 的实例,并 运行 您的脚本具有更多线程。对于你正在执行的任务,我会说你可以 运行 至少使用 CPU*4 个线程,可能更多 - 监控 CPU 利用率并增加线程数,直到你取得好成绩用户 CPU 利用率。
进行自集群 - 在实例启动时将脚本放入 运行 并在未完成任何工作时终止实例,使用现货价格创建一些实例,以及看他们干活
如果你不介意切换语言,你可以使用显式集群和基于消息的调度——比如 Akka 或 Storm。
AWS Big Data blog 引入了一种架构,可以使用 Lambda 在 S3 中并行处理大量文件。原型级实现在 Node.js 中,但架构不依赖于语言。此解决方案假设您可以分发处理。
总结:
- 想法是 运行 一台接收报告请求的 EC2 机器。这台机器在 S3 中创建一个源文件列表(在您的情况下可能是 http 端点),它将分发到第一级 Lambda 函数。
- 这些函数中的每一个都将任务分配给叶级辅助函数。
- 所有结果都汇总回 EC2 机器,该机器将结果实时流式传输给用户(在您的情况下可能是 RDS)。
您的用例不同,但文章展示了一种在很短的时间内并行执行大量分析任务的简单方法 运行。
提供的原型实现缺少生产中所需的几个明显功能,因此只能用于演示。也请查看评论中链接的作者出色的 Re:invent 演示文稿。
我的现状:
我目前有一个 Python 脚本,它通过 HTTP 端点获取数据并每天计算和生成 hundreds/thousands 报告。目前,它 运行 在 AWS EC2 实例上运行,其中队列用于拆分需要跨四个线程生成的报告。一次四个,脚本获取数据,计算每个报告,并将其保存到 PostgreSQL Amazon RDS。
问题:
随着项目规模的扩大,我的脚本将无法足够快地计算,并且无法使用当前方法在一天内生成所需的所有报告。
寻找解决方案:
我偶然发现了 Amazon Lambda,但我还没有发现任何人将它用于与我类似的用例。我的计划是 upload/put 每个报告都需要生成到它自己的 S3 存储桶中,然后在创建存储桶时触发 Lambda 函数。 Lambda 函数将执行所有数据提取(从 HTTP 端点)和所有计算并将其保存到我的 PostgreSQL Amazon RDS 中的一行。从理论上讲,这将使一切并行,并消除等待资源被释放的队列的需要。
基本上,我正在寻找一种解决方案,以确保我的脚本能够每天 运行 并每天完成而不会过度 运行 进入第二天。
我的问题:
Amazon Lambda 适合做这样的事情吗?
用 Amazon Lambda 做这样的事情(每天创建 hundreds/thousands 个 s3 存储桶)成本高吗?
还有更好的选择吗?
非常感谢任何帮助、建议、见解或技巧。谢谢!
Would Amazon Lambda be suitable for something like this?
- 您不能 运行 超过 5 分钟。
- 部署(尤其是当你有很多外部库时)有点笨拙
- 您几乎无法控制 AWS 运行 如何处理您的代码(可能会有延迟或暂停,日志更难获取)
如果这些不是您的严重问题,我认为您的问题听起来很合适。
Would it be costly to do something like this with Amazon Lambda (creating hundreds/thousands of s3 buckets a day)?
参见Lambda Pricing and S3 Pricing。
每天创建数千个存储桶听起来不是个好主意(而且 AWS 可能不允许)。默认情况下,您的账户中可以有 100 个存储桶,每个存储桶名称都是全局的(针对该区域)。也许您的意思是一个存储桶中包含数千个密钥?
这一切都取决于您的报告大小、创建报告所需的时间和内存,以及从 AWS 获取报告的频率(即您为数据传输付费的时间)。 AWS 有一个 cost calculator 虽然有点麻烦,所以您可能更愿意自己从他们的定价页面上弄清楚。
Is there better options?
如果您的报告几乎不断生成,您最好继续自己 运行 服务器。如果您偶尔获得非常大的批量,您最好竞标现货实例或寻找其他云服务提供商。如果您一整天都没有规律地爆发,那么 Lambda 似乎非常适合您。
@Nathaniel 已经回答了大部分问题,但我要补充 "other options" 点:
如果从源的角度来看,您可以 运行 多于四个并行报告(由于 CPU 利用率,您只是将它们限制为四个,而不是因为 HTTP 服务无法处理更高的负载)然后我肯定会说你可以做更多的事情:
重写您的报告以使用 async IO 以便您可以利用 HTTP 请求被阻止的时间。这可以提高您的吞吐量。
获取具有更多 CPU 的实例,并 运行 您的脚本具有更多线程。对于你正在执行的任务,我会说你可以 运行 至少使用 CPU*4 个线程,可能更多 - 监控 CPU 利用率并增加线程数,直到你取得好成绩用户 CPU 利用率。
进行自集群 - 在实例启动时将脚本放入 运行 并在未完成任何工作时终止实例,使用现货价格创建一些实例,以及看他们干活
如果你不介意切换语言,你可以使用显式集群和基于消息的调度——比如 Akka 或 Storm。
AWS Big Data blog 引入了一种架构,可以使用 Lambda 在 S3 中并行处理大量文件。原型级实现在 Node.js 中,但架构不依赖于语言。此解决方案假设您可以分发处理。
总结:
- 想法是 运行 一台接收报告请求的 EC2 机器。这台机器在 S3 中创建一个源文件列表(在您的情况下可能是 http 端点),它将分发到第一级 Lambda 函数。
- 这些函数中的每一个都将任务分配给叶级辅助函数。
- 所有结果都汇总回 EC2 机器,该机器将结果实时流式传输给用户(在您的情况下可能是 RDS)。
您的用例不同,但文章展示了一种在很短的时间内并行执行大量分析任务的简单方法 运行。
提供的原型实现缺少生产中所需的几个明显功能,因此只能用于演示。也请查看评论中链接的作者出色的 Re:invent 演示文稿。