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

from an ec2 instance spin up another ec2 instance and push a csv file on it

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

这种模式通常涉及:

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

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

每个 Amazon EC2 实例上的应用程序 运行ning 将从队列中请求一条消息,检索源数据(如果它存储在 Amazon S3 中),处理数据,存储输出 某处,然后告诉SQS队列删除消息。如果应用程序失败,则 Amazon SQS 会在预先确定的 'invisibility' 时间段后自动将消息放回队列。

没有数据库或队列

你说你不想使用数据库或队列系统,但你没有说为什么会这样。如果希望避免成本,那么请注意,排队只需花费几美分。数据库也可以非常低成本。

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

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

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

正在将文件推送到实例

您的问题询问有关将 CSV 文件推送到实例的问题。这是一个非常糟糕的架构设计,应该避免。与让中央系统 "push" 工作相比,让个体工作者 "pull" 工作总是更稳健,因为他们知道何时可以消耗更多工作。它也更简单,因为将信息推送到实例需要一个强大的方法来接收工作,这比简单地提供一个完全托管的集中式队列要复杂得多。

启动一个 'worker' EC2 实例

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

这种方法的缺点是 EC2 按小时收费,因此让每个实例执行单个 'chunk' 工作可能会更昂贵,尤其是如果它们只需要一小部分小时运行。

使用 AWS Lambda

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

除了 John 的出色回答外,还请查看使用 AWS Batch