我有一个 CPU 密集型数据处理应用程序,我想在多个(约 100,000 个)输入文件上运行它。该应用程序需要一个大型(约 20GB)数据文件才能运行。我想要做的是
- 创建一个安装了我的应用程序和相关数据文件的EC2机器映像
- 启动该映像的大量实例(例如 100 个)
- 将我的输入文件拆分成 100 个批次,并发送一个批次到每个实例进行处理
我无法找到确保每个实例都能访问大型数据文件的最佳方法。数据文件太大,无法放入 AMI 的根文件系统中。我可以使用块存储,但给定的块存储卷只能连接到单个实例,因此我需要 100 个克隆。
有没有办法创建一个在根文件系统上具有更多空间的自定义映像,以便我可以包含我的大型数据文件?或者有没有更好的方法来解决这个问题?
答案1
如果数据基本不变,就把它放到 EBS 卷中并制作快照。启动每个新节点时,让它根据快照创建一个新卷并挂载它。制作快照是一个相当缓慢的过程,但根据快照创建卷却出奇地快!
如果您的数据发生一点变化,将其放入 S3 是一个更简单的维护过程,数百个节点可以同时提取数据,速度不会明显下降(与只有一个节点提取数据相比)。总的来说,这会比上面的 EBS 方法慢,但实施和维护起来会更简单。
答案2
将您的数据文件放入 S3。
创建基于 EBS 的“主”实例:
- 在创建实例期间挂载实例存储
- 在启动时,将大数据文件复制到实例卷
- 本地处理数据
创建您的实例的 AMI 并从您的 AMI 启动 100 个实例。
这样做的好处是每个实例都有自己的本地数据副本,您无需花钱在 EBS 卷上存储多个数据副本。缺点是在启动时需要花时间从 S3 复制数据文件,但一旦复制,处理文件应该会很快,因为它是本地的。
答案3
选项:
使用 S3 存储桶存储您的输入数据。山它在多个工作实例上。
创建一个“主”实例,与您的工作实例共享来自您的 EBS 卷(例如通过 NFS)的输入文件。