运行 Amazon ECS 上的批处理作业

Running Batch Jobs on Amazon ECS

我对使用 AWS 非常陌生,对于 ECS 更是如此。目前,我开发了一个应用程序,可以获取 S3 link,从 link 下载数据,处理数据,然后输出有关该数据的一些信息。我已经将此应用程序打包到 docker 容器中,现在驻留在亚马逊容器注册表中。我现在想做的是启动一个集群,向每个 EC2 实例 运行ning Docker 发送一个 S3 link,让所有容器实例 c运行ch 编号, 并且 return 将所有结果返回到单个节点。我不太明白此时应该如何更改我的应用程序。我是否需要将 docker 容器中的应用程序 运行ning 设为服务?还是我应该通过 ssh 向容器发送命令?然后假设我做到了那么远,那么我如何与集群通信以将可能数百个 S3 link 的工作外包出去?理想情况下,由于我的应用程序计算密集型,我希望每个 EC2 实例只 运行 一个容器。

谢谢!

你的故事很难回答,因为很多问题都没有做很多研究。

我最初的想法是让它完全无状态。

让它们通过 S3 启动和处理,您走在了正确的轨道上。您应该扩展它以使用类似 SQS 队列的东西。这些 SQS 消息将包含一个 S3 link。您的应用程序将启动,从 SQS 抓取一条消息,处理它收到的 link,然后删除该消息。

接下来是不要输出到任何类型的控制台。在别处输出。就像一个不同的 SQS 队列,或某个地方。

这消除了盒子相互交谈的要求。这将加快速度,使其具有无限的可扩展性,并消除围绕使它们进行通信的奇怪的 hackery。

还有为什么每个实例一个容器? 50% 的 2 个线程通常与 100% 的 1 个线程相同。去掉这个要求,你可以使用 ECS + Lambda + Cloudwatch 来根据消息的数量进行扩展。 >10000,放大,那种东西。 <100 缩小。这意味着您可以将数百万条消息放入 SQS,然后让 ECS 扩展以处理它们并输出到其他地方以供使用。

我同意 Marc Young 的观点,您需要使其无状态并将通信层与应用分离。

对于这样的应用程序,我会将 S3 链接放入一个队列中(rabbitMQ 是一个很好的队列,我个人不喜欢 SQS,但它也是一个选项)。然后让 ECS 中的工作节点从队列中提取消息并进行处理。

听起来你有另一个应用程序在做处理。根据输出,您可以将结果放入另一个处理队列并使用相同的模型,或者直接将其填充到某种数据库中(或作为 S3 中的文件)。

除了 Marc 所说的自动缩放之外,还可以考虑使用 cloudwatch + spot 实例来管理 ECS 容器实例的成本。特别是对于繁重的计算任务,您可以获得很大的折扣。