在Amazon ECS上运行批处理作业

时间:2016-07-04 15:31:03

标签: amazon-web-services amazon-s3 amazon-ec2 amazon-ecs

我是使用AWS的新手,对于ECS来说更是如此。目前,我开发了一个应用程序,它可以采用S3链接,从该链接下载数据,处理数据,然后输出有关该数据的一些信息。我已经将这个应用程序打包在一个docker容器中,现在驻留在amazon容器注册表中。我现在要做的是启动集群,向运行Docker的每个EC2实例发送一个S3链接,让所有容器实例处理数字,并将所有结果返回给单个节点。我不太明白我应该如何更改我的应用程序。我是否需要使我的应用程序在docker容器中运行服务?或者我应该通过ssh将命令发送到容器?然后假设我到目前为止,我如何与群集通信以便为可能数百个S3链接分配工作?理想情况下,由于我的应用程序非常耗费计算量,因此我只希望每个EC2实例运行一个容器。

谢谢!

2 个答案:

答案 0 :(得分:3)

你的故事很难回答,因为如果没有做大量的研究就会有很多问题。

我最初的想法是让它完全无国籍。

通过让他们启动并通过S3进行处理,你就走在了正确的轨道上。您应该将其展开以使用类似SQS队列的内容。那些SQS消息将包含S3链接。您的应用程序将启动,从SQS获取消息,处理它获得的链接,并删除该消息。

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

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

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

答案 1 :(得分:2)

我同意Marc Young的意见,你需要让这个无状态并将通信层与应用程序分离。

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

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

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

相关问题