Обрабатывать много файлов одновременно - копировать файлы поверх или читать через NFS? - PullRequest
2 голосов
/ 15 декабря 2010

Мне нужно одновременно обрабатывать большое количество файлов (тысячи разных файлов, средний размер которых составляет 2 МБ на файл).

Вся информация хранится на одном (1,5 ТБ) сетевом жестком диске и будет обрабатываться примерно 30 различными машинами. Для эффективности каждый компьютер будет считывать (и обрабатывать) разные файлы (тысячи файлов должны быть обработаны).

Каждый компьютер - после чтения файла из папки «входящие» на жестком диске 1,5 ТБ - будет обрабатывать информацию и будет готов вывести обработанную информацию обратно в папку «обработано» на 1,5 Туберкулезный диск. обработанная информация для каждого файла имеет примерно такой же средний размер, что и входные файлы (около ~ 2 МБ на файл).

Что лучше сделать:

(1) Для каждой обрабатывающей машины M , Скопируйте все файлы, которые будут обработаны M , на свой локальный жесткий диск, а затем прочитайте и обработайте файлы локально на машине M .

(2) Вместо того, чтобы копировать файлы на каждую машину, каждая машина получит прямой доступ к «входящей» папке (используя NFS), будет читать файлы оттуда и затем обрабатывать их локально.

Какая идея лучше? Есть ли «делать» и «делать», когда кто-то делает это?

Мне очень любопытно, если проблема в том, чтобы 30 машин или около того считывали (или записывали) информацию на один и тот же сетевой диск одновременно?

(примечание: существующие файлы будут только считываться, а не добавляться / записываться; новые файлы будут создаваться с нуля, поэтому не возникает проблем множественного доступа к одному и тому же файлу ...). Есть ли какие-то узкие места, которые я должен ожидать?

(Я использую Linux, Ubuntu 10.04 LTS на всех машинах, если это все имеет значение)

1 Ответ

2 голосов
/ 16 декабря 2010

Я бы определенно сделал # 2 - и сделал бы это следующим образом:

Запустите Apache на вашем главном сервере со всеми файлами.(Или какой-то другой HTTP-сервер, если вы действительно хотите).Есть несколько причин, по которым я бы сделал это следующим образом:

  1. HTTP - это в основном чистый TCP (с некоторыми заголовками).Как только запрос отправлен - это очень «односторонний» протокол.Низкие накладные расходы, не болтливый.Высокая производительность и эффективность - низкие затратылучший способ перемещать данные через открытый Интернет, чем NFS.Вы можете использовать SSL (при необходимости).Вы можете пройти через брандмауэры (при необходимости).etc..etc..etc ...

  2. В зависимости от схемы доступа к вашему файлу и предположении, что файл целом требуется для чтения - это проще/ быстрее просто выполнить одну сетевую операцию - и вытащить весь файл за один раз - вместо того, чтобы постоянно запрашивать операции ввода-вывода по сети каждый раз, когда вы читаете меньший фрагмент файла.

  3. Может быть легко распространять и запускать приложение, которое делает все это - и не зависит от наличия сетевых подключений - конкретных путей к файлам и т. Д. Если у вас есть URLк файлам - клиент может сделать свою работу.Для установки таких монтирований не нужно устанавливать монтирования, жесткий каталог или становиться пользователем root.

  4. Если у вас проблемы с подключением по NFS - вся система может выйти из строя, когдаВы пытаетесь получить доступ к креплениям, и они зависают.С HTTP, работающим в контексте пользовательского пространства - вы просто получаете ошибку тайм-аута - и ваше приложение может предпринять любое действие, которое оно выберет (например, страницу вас - ошибки журнала и т. Д.).

...