2016-07-04 86 views
0

我对使用AWS非常陌生,对于ECS更是如此。目前,我开发了一个应用程序,可以采用S3链接,从该链接下载数据,处理数据,然后输出关于该数据的一些信息。我已经将此应用程序打包在码头工具容器中,现在位于亚马逊容器注册表中。我现在想做的事情是启动一个集群,向运行Docker的每个EC2实例发送一个S3链接,让所有容器实例收缩数字,并将所有结果返回给单个节点。我不太明白我应该如何改变我的申请。我是否需要让我的应用程序在Docker容器中运行一项服务?还是应该通过ssh向容器发送命令?然后假设我得到了那么多,然后如何与群集进行通信,从而为潜在的数百个S3链接提供工作?理想情况下,由于我的应用程序非常计算密集型,我只想为每个EC2实例运行一个容器。在Amazon ECS上运行批量作业

谢谢!

回答

3

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

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

通过使它们启动并通过S3进行处理,您正处于正确的轨道上。你应该扩展这个以使用类似SQS队列的东西。那些SQS消息将包含一个S3链接。您的应用程序将启动,从SQS获取消息,处理其获取的链接,并删除消息。

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

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

另外为什么一个容器每个实例? 50%的2个线程通常与100%的1线程相同。除去此要求,您可以使用ECS + Lambda + Cloudwatch根据消息数进行缩放。 > 10000,放大,那样的事情。 < 100缩小。这意味着您可以将数百万条消息投入到SQS中,并让ECS向上扩展以处理它们并输出到其他地方消费。

+0

我想为每个容器使用不同的ec2实例,因为我正在考虑利用gpus并且不希望容器争夺该资源。 – user985030

+0

如果你使它们成为无状态,那么它仍然有效。如果您的实例具有多个内核,则每个内核只能使用最多1024个容器,因此如何分散这些容器和任务定义取决于您。我不建议让他们沟通。 –

2

我同意马克杨,你需要使这个无状态和解耦从应用程序的通信层。

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

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

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

相关问题