Несколько лет назад MapReduce был провозглашен революцией в распределенном программировании. Также были критики но в целом был восторженный ажиотаж. Он даже запатентован! [1]
Название напоминает map
и о reduce
функциональном программировании, но когда я читаю (Википедия)
Шаг отображения: главный узел принимает входные данные, разделяет их на более мелкие подзадачи и распределяет их по рабочим узлам. Рабочий узел может сделать это снова по очереди, что приведет к многоуровневой древовидной структуре. Рабочий узел обрабатывает меньшую проблему и передает ответ своему главному узлу.
Шаг сокращения: главный узел затем собирает ответы на все подзадачи и каким-то образом объединяет их для формирования выходных данных - ответа на проблему, которую он первоначально пытался решить.
или [2]
Внутренние элементы MAP: [...] MAP разбивает входное значение на слова. [...] MAP предназначен для связывания каждой данной пары ключ / значение ввода с потенциально большим количеством промежуточных пар ключ / значение.
Внутренние элементы REDUCE: [...] [REDUCE] выполняет обязательное агрегирование (скажем, сокращение): принимает много значений и сводит их к одному значению.
Я не могу не думать: это разделяй и властвуй (в смысле Mergesort), просто и понятно! Итак, есть ли в MapReduce (концептуальная) новизна или это просто новая реализация старых идей, полезная в определенных сценариях?
Ответы:
M / R не разделяй и властвуй. Он не предусматривает повторного применения алгоритма к меньшему подмножеству предыдущего ввода. Это конвейер (функция, указанная в виде композиции из более простых функций), где этапы конвейера чередуются и сокращают операции. Разные этапы могут выполнять разные операции.
MapReduce не открывает новых основ в теории вычислений - он не показывает новый способ разложения задачи на более простые операции. Это показывает, что конкретные более простые операции полезны для определенного класса задач.
В MapReduce газеты вклад был
Некоторые критики попадают в эти классы:
источник
РЕДАКТИРОВАТЬ (март 2014 г.) Я должен сказать, что с тех пор я больше работал над алгоритмами для моделей вычислений типа MapReduce, и мне кажется, что я был слишком негативен. Техника «разделяй-сжимай-властвуй», о которой я говорю ниже, удивительно универсальна и может стать основой алгоритмов, которые, на мой взгляд, нетривиальны и интересны.
Позвольте мне предложить ответ, который будет намного хуже, чем у Майка, с точки зрения полноты, но с точки зрения модели вычисления / алгоритмической теории.
Теперь я думаю, что на самом деле это интересный поворот на принцип «разделяй и властвуй», заключающийся в том, что после этапа разделения нужно сжимать решения подзадач, чтобы один процессор мог победить. Тем не менее, это действительно единственная техника, которую мы придумали до сих пор. Это терпит неудачу на проблемах с разреженными графами, такими как разреженная связь, например. Сравните это с потоковой моделью, которая привела к появлению множества новых идей, таких как оригинальный алгоритм сэмплирования Флайолета и Мартина, детерминированный алгоритм спаривания Мисры и Гриса, мощь простых приемов создания эскизов и т. Д.
Как парадигма программирования, уменьшение карты было очень успешным. Мои комментарии рассматривают карту редукции как интересную модель вычислений. Хорошие теоретические модели немного странные. Если они следуют реальности слишком близко, они становятся громоздкими, но, что более важно, теоремы (заимствовать термин из машинного обучения), доказанные для моделей, которые являются слишком конкретными, не обобщаются, т.е. не выполняются в других моделях. Вот почему мы хотим абстрагироваться как можно больше деталей, оставляя при этом достаточно, чтобы бросить вызов нам, чтобы придумать новые алгоритмы. Наконец, эти новые идеи должны в конечном итоге вернуться в реальный мир. PRAM - одна нереалистичная модель, которая привела к интересным идеям, но эти идеи оказались редко применимыми к параллельным вычислениям в реальном мире. С другой стороны, потоковое вещание также нереально, но это вдохновило алгоритмические идеи, которые фактически используются в реальном мире. Видетьмини-набросок . Методы рисования на самом деле также используются в системах, основанных на уменьшении карты.
источник
Я полностью согласен с вами. С концептуальной точки зрения нет ничего действительно нового: Map / Reduce изначально был известен в Parallel Computing как модель программирования потока данных. Однако с практической точки зрения Map / Reduce, предложенный Google и последующими реализациями с открытым исходным кодом, также поддерживает Cloud Computing и в настоящее время довольно популярен для очень простых параллельных декомпозиций и обработки. Конечно, он не подходит для чего-либо еще, требующего сложной области или функциональных разложений.
источник
Я думаю, что вы ударили по голове своим комментарием.
Неверно, что в любом функциональном языке карты можно распараллелить - язык должен быть чистым . (Я считаю, что Haskell - единственный не совсем понятный, чисто функциональный язык. Lisp, OCaml и Scala не являются чистыми.)
Мы знали о преимуществах чистого кода еще с момента разделения времени, когда инженеры впервые конвейеризировали свои процессоры. Так почему же никто не использует чистый язык?
Это действительно очень сложно. Программирование на чистом языке часто ощущается как программирование, когда обе руки связаны за спиной.
Что делает MR, так это несколько ослабляет ограничение чистоты и обеспечивает основу для других частей (например, фазы случайного воспроизведения), что делает довольно простым написание распространяемого кода для большой части проблем.
источник
count
разделяемая переменная в вашем псевдокоде; просто передать его текущее значениеdo_something
должно работать. Можете ли вы привести пример «реального» алгоритма обработки данных (Mergesort, Quicksort, ...), для которого рекурсивные вызовы зависят друг от друга (после вызова)?