Основным отличием будет то, что MapReduce, очевидно, патентоспособен. (ничего не могу с собой поделать, извините ...)
На более серьезном замечании статья MapReduce, насколько я помню, описывает методологию выполнения вычислений в широком распараллеливании. Эта методология основана на конструкции map / lower, которая была хорошо известна много лет назад, но выходит за рамки таких вопросов, как распределение данных и т. Д. Кроме того, на структуру данных, которые обрабатываются и возвращаются функциями, используемыми в map
-подобные и reduce
-подобные части вычислений (вещь о данных, поступающих в списках пар ключ / значение), так что вы можете сказать, что MapReduce является дружественной для массивного параллелизма специализацией из комбинации map
& reduce
.
Что касается комментария из Википедии о функции, отображаемой в конструкции функционального программирования map
/ reduce
, выдающей одно значение на вход ... Хорошо, конечно, но здесь ограничений вообще нет по типу указанного значения . В частности, это может быть сложная структура данных, например, список вещей, к которым вы снова примените преобразование map
/ reduce
. Возвращаясь к примеру «подсчета слов», вы вполне могли бы иметь функцию, которая для данной части текста генерирует структуру данных, отображающую слова в счетчики вхождений, map
, которые поверх ваших документов (или кусков документов, как случай может быть) и reduce
результаты.
На самом деле, именно это и происходит в этой статье Фила Хагельберга. Это забавный и в высшей степени короткий пример вычисления, подобного подсчету слов в MapReduce, реализованного в Clojure с map
и эквивалентного reduce
(бит (apply + (merge-with ...))
- merge-with
реализован в терминах reduce
в clojure.core). Единственное различие между этим и примером из Википедии состоит в том, что подсчитываемые объекты являются URL-адресами, а не произвольными словами - кроме этого, у вас есть алгоритм подсчета слов, реализованный с map
и reduce
, стиль MapReduce, верно там. Причина, по которой он может не полностью квалифицироваться как экземпляр MapReduce, заключается в том, что здесь нет сложного распределения рабочих нагрузок. Все это происходит в одном блоке ... хотя и на всех процессорах, которые предоставляет блок.
Подробное описание функции reduce
- также известной как fold
- см. В руководстве Грэма Хаттона , посвященном универсальности и выразительности складки . Это основано на Haskell, но должно быть читабельным, даже если вы не знаете язык, если вы готовы посмотреть на Haskell или два на ходу ... Такие вещи, как ++
= конкатенация списков, не глубокая Магия Хаскелла.