2

我需要同时处理大量文件(数千个不同的文件,每个文件的平均大小为 2MB)。

所有信息都存储在一个 (1.5TB) 网络硬盘上,将由大约 30 台不同的机器处理。为了提高效率,每台机器将读取(和处理)不同的文件(有数千个文件需要处理)。

每台机器——在从 1.5TB 硬盘上的“传入”文件夹中读取文件之后——将处理信息并准备将处理后的信息输出回 1.5TB 硬盘上的“已处理”文件夹。每个文件的处理信息与输入文件的平均大小大致相同(每个文件约 2MB)。

有什么更好的做法:

(1) 对于每台处理机M ,将M将要处理的所有文件复制到其本地硬盘中,然后在机器M上本地读取和处理文件。

(2) 不是将文件复制到每台机器,而是每台机器将直接访问“传入”文件夹(使用 NFS),并从那里读取文件,然后在本地处理它们。

哪个想法更好?当一个人做这样的事情时,是否有任何“做”和“不做”?

我很好奇,让 30 台左右的机器同时读取(或写入)信息到同一个网络驱动器是否有问题?

(注意:现有文件只会被读取,不会被追加/写入;新文件将从头开始创建,因此不存在多次访问同一文件的问题......)。有没有我应该预料到的瓶颈?

(如果一切都很重要,我会在所有机器上使用 Linux、Ubuntu 10.04 LTS)

4

1 回答 1

2

我肯定会做#2 - 我会这样做:

使用所有文件在主服务器上运行 Apache。(或者其他一些 HTTP 服务器,如果你真的想要的话)。我这样做有几个原因:

  1. HTTP 基本上是纯 TCP(上面有一些标头)。一旦发送请求 - 这是一个非常“单向”的协议。低开销,不健谈。高性能和效率 - 低开销。

  2. 如果您(无论出于何种原因)决定需要移动或扩展它(例如使用 can 服务),那么 HTTP 将是在开放 Internet 上移动数据的更好方式,而不是 NFS。您可以使用 SSL(如果需要)。您可以通过防火墙(如果需要)。等等……等等……等等……

  3. 取决于文件的访问模式,并假设需要读取整个文件 - 只需执行一项网络操作会更容易/更快 - 并一次将整个文件拉入 - 而不是不断请求 I/O每次您读取较小的文件时,网络。

  4. 分发和运行执行所有这些操作的应用程序可能很容易 - 并且不依赖于网络安装的存在 - 特定文件路径等。如果您有文件的 URL - 客户端可以完成它的工作。它不需要建立挂载、硬目录或成为根来设置这样的挂载。

  5. 如果您有 NFS 连接问题 - 当您尝试访问挂载时,整个系统可能会变得异常,并且它们会挂起。使用在用户空间上下文中运行的 HTTP - 您只会收到超时错误 - 您的应用程序可以执行它选择的任何操作(例如您的页面 - 记录错误等)。

于 2010-12-15T21:25:29.957 回答