Как разделить работу на сеть компьютеров?

11

Представьте себе следующий сценарий: допустим, у вас есть центральный компьютер, который генерирует много данных. Эти данные должны пройти некоторую обработку, которая, к сожалению, занимает больше времени, чем генерация. Чтобы обработка работала в режиме реального времени, мы подключаем больше подчиненных компьютеров.

Кроме того, мы должны учитывать возможность выпадения рабов из сети в середине работы, а также добавления дополнительных рабов. Центральный компьютер должен гарантировать, что все задания завершены, и что задания, отброшенные подчиненным, передаются другому.

Главный вопрос: какой подход я должен использовать для достижения этой цели?

Но, возможно, следующее поможет мне прийти к ответу: есть ли название или шаблон дизайна для того, что я пытаюсь сделать?

Какие области знаний мне нужны для достижения цели, чтобы заставить эти компьютеры общаться друг с другом? (например, будет ли достаточно базы данных, о которой я знаю, или это будет включать сокеты, о которых я еще не знаю?)

Есть ли примеры такой системы? Основной вопрос немного общий, поэтому было бы хорошо иметь отправную точку / контрольную точку.

Заметьте, я предполагаю ограничения c ++ и windows, поэтому решения, направленные в этом направлении, будут оценены.

Морпорке
источник
1
Ищите системы очередей или рабочих процессов, примеры: aws.amazon.com/sqs en.wikipedia.org/wiki/Message_queue etcetera . Система очередей может позаботиться о распределении, проверке и переназначении.
Люк Франкен
2
Термин, который вы ищете, это распараллеливание . Прежде чем идти по этому пути, убедитесь, что ваша проблема действительно может быть решена параллельно (например, результат для элемента n не зависит от результата для элемента n-1 ).
Blrfl
Посмотрите на boinc
@Blrfl Я думаю, что распараллеливание обычно не связано с этим, распараллеливание обычно связано с многопоточным или многопроцессорным выполнением на одной машине с использованием нескольких ядер / процессоров или одновременным выполнением на одной машине. Распределенные вычисления - это то, на что он ссылается, и в своем описании они не имеют гарантий параллелизма, только гарантии асинхронности (то есть недетерминированного выполнения, которое может быть одновременным, синхронным или отложенным в очереди)
Джимми Хоффа,
3
Я удивлен, что никто не упомянул hadoop.
Кевин

Ответы:

12

Есть ли примеры такой системы?

Да. Этот паттерн известен как распределенные вычисления (или распределенное программирование, или любое другое крутое слово, которое вы хотите добавить после распределения). Мое предложение будет заключаться в том, чтобы не строить это собственными силами, прежде чем искать другие решения. Вы можете посмотреть на этот вопрос переполнения стека для различных вариантов. А потом принять взвешенное решение.

Маной Р
источник
3
Не забудьте новое любимое слово для этого: облако ! или облачные вычисления. Если вы делаете это на своих компьютерах, люди называют их личным облаком или мини- облаком . Продавать ерунду, это было известно, как вы говорили, как распределенные вычисления в течение многих лет, просто подбрасывая ОП, чтобы он знал, где он читает о облачных вещах, о которых он говорит именно об этом.
Джимми Хоффа
3
@JimmyHoffa: слово «облако» также часто используется для обозначения того, что ваши данные, а также программное обеспечение, которое вы используете для их работы, находятся где-то в Интернете, а не на вашем локальном компьютере. И все же в других случаях это означает, что вы используете виртуальную машину, работающую в кластере, а не один монолитный хост виртуальной машины; очевидное преимущество заключается в прозрачной отказоустойчивости без простоев.
tdammers
2
@tdammers верно, но тем не менее тип системы, описываемый ОП, является одним из многих, использующих маркетинговую прозвище Облака, наряду с, как вы указали, практически всем остальным. Это то, что делает его модным словом, оно было изобретено без определения, чтобы люди применяли его ко многим другим вещам, чтобы оно фактически означало все и ничего. Ура умных слов.
Джимми Хоффа
1
@JimmyHoffa: Это также то, что делает упоминание слова «облако» здесь совершенно неконструктивным.
tdammers
3
Это может быть хорошим словом для использования против управления. "Каково ваше решение этой проблемы обработки данных?" «Ну, мы могли бы распределить его по сети компьютеров и вычислить их параллельно». ПУСТОЙ СМОТРЕТЬ. «Мы можем построить мини-облако». "OKAY CARRY ON"
Morpork
4

Как отмечалось в других ответах, это поле известно как распределенные вычисления , грид-вычисления , кластерные вычисления и высокопроизводительные вычисления .

Позвольте мне добавить различие, которое заключается в том, что, когда система может быть изменена после запуска, чтобы соответствовать рабочей нагрузке, она называется « эластичной », и это отличается от традиционных вычислений в сетке. Это одна из (не связанных с маркетингом) причин для термина « облачные вычисления »: пользователю не нужно планировать емкость, а количество и расположение компьютеров, выполняющих вычисления, остаются для него как для облака бесполезными.

Кроме того, ваше требование о том, что мастер перепланирует неудавшиеся задачи, называется свойством « отказоустойчивости » этой системы. (Обязательная ссылка на этот мультфильм )

Какой подход вы должны использовать для создания собственного частного облака? В моем заказе или предпочтении:

  1. Не создавайте свое собственное облако , используйте инфраструктуру, предоставленную другими. Amazon называет это виртуальным частным облаком , а Rackspace - просто частным облаком ; Я уверен, что вы можете найти другие предложения и сравнить.

  2. Не создавайте свой собственный механизм распределенных вычислений , используйте механизм, предоставленный другими. Если вы настаиваете на использовании своих машин, используйте как можно больше программного обеспечения, которое предоставляется и тестируется другими. Вы можете использовать Hadoop из C ++ через интерфейс Pipes или из любого исполняемого файла через Streaming API . На Spark есть похожий потоковый интерфейс .

  3. Не используйте все компоненты с нуля , используйте компоненты сообщества. Если по какой-то причине вы уже прочитали и хотите развернуть свои собственные облачные компоненты, не начинайте со стандартной библиотеки C ++. Основные компоненты, которые вам понадобятся:

    • система очередей, как отмечено в комментарии , для отправки задач от мастера к узлам обработки и для отправки подтверждений результатов от узлов обработки к мастеру
    • распределенная файловая система, так что узлы обработки могут получить доступ к данным для работы.

    Есть много альтернатив для обоих. Для организации очередей RabbitMQ имеет установщик Windows, как и ZeroMQ . Что касается распределенных файловых систем, у меня действительно недостаточно опыта работы с Windows: похоже, вы можете организовать общие ресурсы SMB в DFS , но я не могу дать вам подсказку. Как можно заметить в другом ответе, вы можете использовать распределенную базу данных, такую ​​как MongoDB для данных; он работает на Windows .

Вы также можете подумать об использовании MPI (обычно это реализация OpenMPI , обычно через оболочку Boost ), но обратите внимание, что программы MPI сами по себе не являются ни эластичными, ни отказоустойчивыми; Вы должны позаботиться об этом самостоятельно (по крайней мере, они предоставляют некоторые механизмы для достижения этой цели ). Вот почему я бы порекомендовал вам сначала оценить структуру для распространения, которая обладает такими свойствами.

logc
источник