我需要同时处理大量文件(数千个不同的文件,每个文件的平均大小为2MB)。
所有信息都存储在一个(1.5TB)网络硬盘上,并由大约30台不同的机器处理。为了提高效率,每台机器都将读取(和处理)不同的文件(需要处理数千个文件)。
每台机器 - 从1.5TB硬盘驱动器上的'incoming'文件夹中读取文件后 - 将处理信息并准备将处理后的信息输出回1.5上的'processed'文件夹TB驱动器。每个文件的处理信息与输入文件的平均大小大致相同(每个文件约为2MB)。
做什么更好:
(1)对于每台处理机 M ,将 M 处理的所有文件复制到本地硬盘中,然后阅读&在机器 M 上本地处理文件。
(2)不是将文件复制到每台机器,而是每台机器直接访问“传入”文件夹(使用NFS),并从那里读取文件,然后在本地处理它们。
哪个想法更好?当一个人做这样的事情时,有没有'做'和'做'?
如果有30台机器同时读取(或写入)同一网络驱动器的信息是一个问题,我很好奇吗?
(注意:现有文件只会被读取,不会附加/写入;新文件将从头开始创建,因此不存在多次访问同一文件的问题......)。是否存在我应该期待的瓶颈?
(如果一切都很重要的话,我会在所有机器上使用Linux,Ubuntu 10.04 LTS)
答案 0 :(得分:2)
我肯定会做#2 - 我会这样做:
使用所有文件在主服务器上运行Apache。 (或者其他一些HTTP服务器,如果你真的想要)。有几个原因我会这样做:
HTTP基本上是纯TCP(上面有一些标头)。一旦请求被发送 - 这是一个非常“单向”的协议。低开销,不开心。高性能和高效率 - 低开销。
如果你(出于某种原因)决定你需要移动或扩展它(例如,使用can服务),HTTP将是一种更好的方式来通过开放的Internet移动数据,而不是NFS 。您可以使用SSL(如果需要)。您可以通过防火墙(如果需要)。 etc..etc..etc ...
取决于文件的访问模式,并假设需要读取整个文件 - 只需执行一次网络操作就更容易/更快 - 并将整个文件拉入在一次打击中 - 而不是每次读取文件的较小部分时不断通过网络请求I / O.
可以很容易地分发和运行完成所有这些操作的应用程序 - 并且不依赖于网络挂载的存在 - 特定文件路径等。如果您有文件的URL - 客户端可以做到这一点。它不需要建立安装,硬目录 - 或者成为root来设置这样的安装。
如果您遇到NFS连接问题 - 当您尝试访问挂载并挂起时,整个系统可能会变得非常糟糕。使用HTTP在用户空间上下文中运行 - 您只会收到超时错误 - 您的应用程序可以采取它选择的任何操作(例如页面 - 记录错误等)。