从ec2实例启动另一个ec2实例并在其上推送一个csv文件

我想在csv文件中的多个数据集上运行多个algorithm。 所以我想扩大ec2实例,所以所有的实例可以在不同的数据集上并行运行。 我想找出一种方法来扩大ec2实例,并将不同的数据集(.csv)粘贴到每个实例。 注意:我不想实现一个排队系统并使用一个数据库。

这种模式通常包括:

  • 一个中央系统将工作“推”到某种forms的存储中,所有实例都可以访问,例如Amazon SQS队列
  • 维护所需数量的Amazon EC2实例的Auto Scaling组 (使用可选规则更改基于度量标准的实例数)
  • 运行应用程序的每个实例上的启动脚本
  • 从队列提取工作的应用程序,对其进行处理,将结果存储在某个地方(例如,在数据库或Amazon S3中),然后重复该过程

您应该获取源数据(例如CSV文件)并将其推送到Amazon SQS队列中的单个工作块。 消息可以包含实际的input数据,也可以包含指向存储在Amazon S3中的文件的链接。

运行在每个Amazon EC2实例上的应用程序将从队列请求消息,如果源数据存储在Amazon S3中,则检索源数据,处理数据,将输出存储在某处 ,然后通知SQS队列删除该消息。 如果应用程序失败,则Amazon SQS将在预定的“隐形”期限后自动将消息放回队列。

没有数据库或队列

你说你不想使用一个数据库或一个排队系统,但你不知道为什么这样。 如果是为了避免成本,那么请注意,排队只花费你几分钱。 数据库也可以是非常低的成本。

您可以使用Amazon S3来存储工作,每个应用程序实例都会抓取一个文件进行处理。 应用程序将删除文件,处理工作,然后将结果存储到Amazon S3。

您将有效地将Amazon S3用作伪数据库和工作队列。

这种方法的问题是,应用程序可能会失败,从而导致失去工作,并且应用程序的多个实例可能会尝试同时抓取同一个工作项目,从而导致重复的工作。 Amazon SQS有助于避免这两种情况。

将文件推送到实例

您的问题是关于将CSV文件推送到实例的问题。 这是一个非常差的build筑devise,应该避免。 而不是有一个中央系统“推”的工作,让个体工人“拉”工作总是更强大,因为他们知道什么时候可以消耗更多的工作。 它也简单得多,因为将信息推送到一个实例需要一个强大的接收工作的方法,这比创build一个完全pipe理的集中式队列要复杂得多。

旋转“工人”EC2实例

最糟糕的情况是,你可以为每个“大块”工作提供一个单独的EC2实例。 如果工作定义很小,则可以将其作为用户数据的一部分传递。 如果工作定义很大,则将其存储在Amazon S3中,并通过用户数据或通过启动时分配给该实例的标签传递对该实例的引用。 (实例可以在启动时检查自己的标签,检索引用,然后从S3中检索数据。)

这种做法的不利之处在于EC2是按小时计费的,所以每个实例做一个“大块”的工作可能会变得更加昂贵,特别是如果他们只需要一个小时的时间来操作。

使用AWS Lambda

另一种select是使用AWS Lambda函数,而不是使用Amazon EC2。 一个优雅的方法是将每个工作块作为一个对象存储在Amazon S3中。 这可以触发AWS Lambda函数来处理input文件并将输出存储在某处(例如,在另一个S3存储桶中)。 但请注意,Lambda函数最多只能运行5分钟,这可能不适用于您的使用情况。

除了John的很好的回答,还可以看看使用AWS Batch 。