mapreduce
требует как входную функцию карты, которая получает блоки данных и которая выводит промежуточные результаты, так и входную функцию сокращения, которая читает промежуточные результаты и приводит к конечному результату. Таким образом, нормально разбивать вычисление на две связанные части для карты и уменьшать функции для выполнения отдельно. Для примера, чтобы найти максимальное значение в наборе данных, функция map может найти максимальное значение в каждом блоке входных данных, и тогда функция reduce может найти одно максимальное значение среди всех промежуточных максимумов.
Этот рисунок показывает фазу Reduce mapreduce
алгоритм.
Фаза Сокращения mapreduce
алгоритм имеет следующие шаги:
Результат фазы Map mapreduce
алгоритм является промежуточным KeyValueStore
объект, который содержит все пары "ключ-значение", добавленные функцией map. Перед вызовом функции сокращения, mapreduce
группирует значения в промежуточных KeyValueStore
объект уникальным ключом. Каждый уникальный ключ в промежуточном KeyValueStore
объект приводит к одному вызову функции сокращения.
Для каждого ключа, mapreduce
создает ValueIterator
объект, который содержит все значения, связанные с этим ключом.
Функция reduce прокручивает значения из ValueIterator
использование объекта hasnext
и getnext
функции, которые обычно используются в while
цикл.
После выполнения суммарного вычисления функция reduce добавляет одну или несколько пары "ключ-значение" к конечной KeyValueStore
использование объекта add
и addmulti
функций.
Фаза Сокращения mapreduce
алгоритм завершен, когда функция сокращения обрабатывает все уникальные промежуточные ключи и связанные с ними значения. Результат этой фазы mapreduce
алгоритм (подобный фазе Map) является KeyValueStore
объект, содержащий все последние пары "ключ-значение", добавленные функцией сокращения. После фазы Reduce, mapreduce
вытаскивает пары "ключ-значение" из KeyValueStore
и возвращает их в datastore (a KeyValueDatastore
объект по умолчанию). Пары "ключ-значение" в выход datastore не находятся в сортированном порядке; они появляются в том же порядке, в котором они были добавлены функцией reduce.
mapreduce
автоматически вызывает функцию reduce для каждого уникального ключа в промежуточном KeyValueStore
Объект функция сокращения должна удовлетворять определенным основным требованиям, чтобы запускаться правильно во время этих автоматических вызовов. Эти требования коллективно обеспечивают правильное перемещение данных через фазу сокращения mapreduce
алгоритм.
Входы в функцию reduce intermKey
, intermValIter
, и outKVStore
:
intermKey
является одним из уникальных ключей, добавленных функцией map. Каждый вызов функции сокращения на mapreduce
задает новый уникальный ключ из ключей в промежуточном KeyValueStore
объект.
intermValIter
является ValueIterator
объект, сопоставленный с активной клавишей, intermKey
. Этот ValueIterator
объект содержит все значения, связанные с активным ключом. Прокрутка значений осуществляется с помощью hasnext
и getnext
функций.
outKVStore
- имя для конечного KeyValueStore
объект, к которому функция сокращения должна добавить пар "ключ-значение". add
и addmulti
функции используют это имя объекта, чтобы добавить пар "ключ-значение" к выходу. mapreduce
принимает выходные пары "ключ-значение" из outKVStore
и возвращает их в выход datastore, который является KeyValueDatastore
объект по умолчанию. Если функция reduce не добавляет никаких пар "ключ-значение" к outKVStore
, затем mapreduce
возвращает пустой datastore.
В дополнение к этим основным требованиям к функции reduce, пары "ключ-значение", добавленные функцией reduce, должны также удовлетворять этим условиям:
Ключи должны быть числовыми скалярами, векторами символов или строками. Числовые ключи не могут быть NaN
, логический, сложный, или разреженный.
Все ключи, добавленные функцией reduce, должны иметь один и тот же класс, но этот класс может отличаться от класса ключей, добавленных функцией map.
Если на OutputType
аргумент mapreduce
является 'Binary'
(по умолчанию), тогда значение, добавленное функцией reduce, может быть любым MATLAB® объект, включая все допустимые типы данных MATLAB.
Если на OutputType
аргумент mapreduce
является 'TabularText'
, тогда значение, добавленное редукционной функцией, может быть числовым скаляром, вектором символов или строкой. В этом случае значение не может быть NaN
, сложный, логический или разреженный.
Примечание
Вышеуказанные требования к паре "ключ-значение" могут отличаться при использовании других продуктов с mapreduce
. Ознакомьтесь с документацией по соответствующему продукту, чтобы получить требования к паре "ключ-значение" продукта.
Вот несколько иллюстративных функций сокращения, используемых в mapreduce
примеры.
Одним из простейших примеров редуктора является maxArrivalDelayReducer
, который является редуктором для примера Найти максимальное значение с MapReduce. Функция map в этом примере находит максимальную задержку прибытия в каждом фрагменте входных данных. Затем функция reduce завершает задачу, находя одно максимальное значение среди всех промежуточных максимумов. Чтобы найти максимальное значение, редуктор прокручивает значения в ValueIterator
и сравнивает каждое значение с текущим максимумом. mapreduce
вызывает эту функцию редуктора только один раз, поскольку mapper добавляет один уникальный ключ к промежуточному KeyValueStore
объект. Функция reduce добавляет одну пару "ключ-значение" к выходу.
function maxArrivalDelayReducer(intermKey, intermValIter, outKVStore) % intermKey is 'PartialMaxArrivalDelay'. intermValIter is an iterator of % all values that has the key 'PartialMaxArrivalDelay'. maxVal = -Inf; while hasnext(intermValIter) maxVal = max(getnext(intermValIter), maxVal); end % The key-value pair added to outKVStore will become the output of mapreduce add(outKVStore,'MaxArrivalDelay',maxVal); end
Более продвинутый пример редуктора statsByGroupReducer
, который является редуктором для примера Вычисление сводной статистики по группам с использованием MapReduce. Функция map в этом примере группирует данные в каждом входе с помощью дополнительного параметра (перевозчик авиакомпании, месяц и так далее), а затем вычисляет несколько статистических величин для каждой группы данных. Функция сокращения завершает задачу, извлекая статистические величины и конкатенируя их в длинные векторы, а затем используя векторы, чтобы вычислить окончательные статистические величины для счета, среднего значения, отклонения, перекоса и куртоза. Редуктор хранит эти значения как поля в структуре, так что каждый уникальный ключ имеет структуру статистических величин в выходе.
function statsByGroupReducer(intermKey, intermValIter, outKVStore) % Reducer function for the StatisticsByGroupMapReduceExample. % Copyright 2014 The MathWorks, Inc. n = []; m = []; v = []; s = []; k = []; % get all sets of intermediate statistics while hasnext(intermValIter) value = getnext(intermValIter); n = [n; value(1)]; m = [m; value(2)]; v = [v; value(3)]; s = [s; value(4)]; k = [k; value(5)]; end % Note that this approach assumes the concatenated intermediate values fit % in memory. Refer to the reducer function, covarianceReducer, of the % CovarianceMapReduceExample for an alternative pairwise reduction approach % combine the intermediate results count = sum(n); meanVal = sum(n.*m)/count; d = m - meanVal; variance = (sum(n.*v) + sum(n.*d.^2))/count; skewnessVal = (sum(n.*s) + sum(n.*d.*(3*v + d.^2)))./(count*variance^(1.5)); kurtosisVal = (sum(n.*k) + sum(n.*d.*(4*s + 6.*v.*d +d.^3)))./(count*variance^2); outValue = struct('Count',count, 'Mean',meanVal, 'Variance',variance,... 'Skewness',skewnessVal, 'Kurtosis',kurtosisVal); % add results to the output datastore add(outKVStore,intermKey,outValue);
Для получения дополнительной информации об общих шаблонах программирования в карте или сокращении функций, смотрите Создайте Эффективные Алгоритмы с MapReduce.
add
| addmulti
| getnext
| hasnext
| mapreduce
| tabularTextDatastore