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

时间:2017-05-26 23:44:38

标签: docker amazon-ec2 boto

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

2 个答案:

答案 0 :(得分:1)

这种模式通常涉及:

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

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

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

没有数据库或队列

您说您不想使用数据库或排队系统,但您没有说明为什么会这样。如果它是一个避免成本的愿望,那么请注意,一个队列只需几美分。数据库也可以是非常低成本的。

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

您实际上可以将Amazon S3用作伪数据库和工作队列。

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

将文件推送到实例

您的问题询问如何将CSV文件推送到实例。这是一个非常糟糕的建筑设计,应该避免。而不是让中央系统“推动”工作,让个体工人“拉”工作总是更加健壮,因为他们知道什么时候可以消耗更多的工作。它也更简单,因为将信息推送到实例需要一种强大的接收工作方法,这可能比创建一个完全托管的集中式队列要复杂得多。

启动'工人'EC2实例

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

这种方法的缺点是EC2按小时计费,因此让每个实例做一个“大块”工作可能会花费更多,特别是如果他们只需要一小部分时间来操作。

使用AWS Lambda

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

答案 1 :(得分:0)

除了John的好答案之外,还可以使用AWS Batch