mapreduce
требует и входной функции карты, которая получает фрагменты данных и того выходного промежуточного звена результаты, и вход уменьшает функцию, которая читает, промежуточное звено заканчивается и приводит к конечному результату. Таким образом нормально разбить вычисление в две связанных части для map и reduce функций, чтобы выполнить отдельно. Например, чтобы найти максимальное значение в наборе данных, функция карты может найти максимальное значение в каждом фрагменте входных данных, и затем уменьшать функция может найти одно максимальное значение среди всех промежуточных максимумов.
Эти данные показывают фазу Reduce алгоритма mapreduce
.
Фаза Reduce алгоритма mapreduce
имеет следующие шаги:
Результатом фазы Map алгоритма mapreduce
является промежуточный объект KeyValueStore
, который содержит все пары "ключ-значение", добавленные функцией карты. Прежде, чем вызвать уменьшать функцию, mapreduce
группирует значения в промежуточном объекте KeyValueStore
уникальным ключом. Каждый уникальный ключ в промежуточном объекте KeyValueStore
приводит к одному вызову уменьшать функции.
Для каждого ключа mapreduce
создает объект ValueIterator
, который содержит все значения, сопоставленные с тем ключом.
Уменьшать функция просматривает значения путем прокрутки от объекта ValueIterator
с помощью hasnext
и функций getnext
, которые обычно используются в цикле while
.
После выполнения итогового вычисления уменьшать функция добавляет одну или несколько пар "ключ-значение" в итоговый объект KeyValueStore
с помощью функций addmulti
и add
.
Фаза Reduce алгоритма mapreduce
завершена когда уменьшать функциональные процессы все уникальные промежуточные ключи и их присваиваемые значения. Результатом этой фазы алгоритма mapreduce
(подобный фазе Map) является объект KeyValueStore
, содержащий все итоговые пары "ключ-значение", добавленные уменьшать функцией. После фазы Reduce mapreduce
вытягивает пары "ключ-значение" от KeyValueStore
и возвращает их в datastore (объект KeyValueDatastore
по умолчанию). Пары "ключ-значение" в выходном datastore не находятся в отсортированном порядке; они появляются в том же порядке, как они были добавлены уменьшать функцией.
mapreduce
автоматически вызывает уменьшать функцию для каждого уникального ключа в промежуточном объекте KeyValueStore
, таким образом, уменьшать функция должна удовлетворить определенные основные требования, чтобы запуститься правильно во время этих автоматических вызовов. Эти требования коллективно гарантируют соответствующее перемещение данных через фазу Reduce алгоритма mapreduce
.
Входными параметрами к уменьшать функции является intermKey
, intermValIter
и outKVStore
:
intermKey
является одним из уникальных ключей, добавленных функцией карты. Каждый вызов уменьшать функции mapreduce
задает новый уникальный ключ от ключей в промежуточном объекте KeyValueStore
.
intermValIter
является объектом ValueIterator
, сопоставленным с активным ключом, intermKey
. Этот объект ValueIterator
содержит все значения, сопоставленные с активным ключом. Просмотрите значения путем прокрутки с помощью функций getnext
и hasnext
.
outKVStore
является именем для итогового объекта KeyValueStore
, в который уменьшать функция должна добавить пары "ключ-значение". add
и функции addmulti
используют это имя объекта, чтобы добавить пары "ключ-значение" в вывод. mapreduce
берет выходные пары "ключ-значение" из outKVStore
и возвращает их в выводе datastore
, который является объектом KeyValueDatastore
по умолчанию. Если уменьшать функция не добавляет пар "ключ-значение" в outKVStore
, то mapreduce
возвращает пустой datastore.
В дополнение к этим основным требованиям для уменьшать функции пары "ключ-значение", добавленные уменьшать функцией, должны также удовлетворить этим условиям:
Ключи должны быть числовыми скалярами, векторами символов или строками. Числовыми ключами не может быть NaN
, логический, комплексный, или разреженный.
Все ключи, добавленные уменьшать функцией, должны иметь тот же класс, но тот класс может отличаться от класса ключей, добавленных функцией карты.
Если аргументом OutputType
mapreduce
является 'Binary'
(значение по умолчанию), то значение, добавленное уменьшать функцией, может быть любым объектом MATLAB®, включая все допустимые типы данных MATLAB.
Если аргументом OutputType
mapreduce
является 'TabularText'
, то значение, добавленное уменьшать функцией, может быть числовым скаляром, вектором символов или строкой. В этом случае значением не может быть NaN
, комплексный, логический, или разреженный.
Вышеупомянутые требования пары "ключ-значение" могут не согласиться при использовании других продуктов с mapreduce
. См. документацию для соответствующего продукта, чтобы получить специфичные для продукта требования пары "ключ-значение".
Эти примеры содержат, некоторые уменьшают функции, используемые примерами mapreduce
в папке toolbox/matlab/demos
.
Одним из самых простых примеров редуктора является maxArrivalDelayReducer.m
, который является редуктором для файла в качестве примера MaxMapReduceExample.m
. Функция карты в этом примере находит максимальную задержку прибытия каждого фрагмента входных данных. Затем уменьшать функция закончила задачу путем нахождения одного максимального значения среди всех промежуточных максимумов. Чтобы найти максимальное значение, редуктор просматривает значения путем прокрутки в объекте ValueIterator
и сравнивает каждое значение с текущим максимумом. mapreduce
только вызывает эту функцию редуктора однажды, поскольку картопостроитель добавляет один уникальный ключ в промежуточный объект KeyValueStore
. Уменьшать функция добавляет одну пару "ключ-значение" в вывод.
type maxArrivalDelayReducer.m
function maxArrivalDelayReducer(intermKey, intermValIter, outKVStore) % Reducer function for the MaxMapreduceExample. % Copyright 2014 The MathWorks, Inc. % 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);
Более усовершенствованным примером редуктора является statsByGroupReducer.m
, который является редуктором для файла в качестве примера StatisticsByGroupMapReduceExample.m
. Функция карты в этом примере группирует данные в каждом входе с помощью дополнительного параметра (поставщик услуг авиакомпании, месяц, и так далее), и затем вычисляет несколько статистических количеств для каждой группы данных. Уменьшать функция закончила задачу путем получения статистических количеств и конкатенации их в длинные векторы, и затем использования векторов, чтобы вычислить итоговые статистические количества для количества, среднего значения, отклонения, скошенности и эксцесса. Редуктор хранит эти значения как поля в структуре, так, чтобы каждый уникальный ключ имел структуру статистических количеств в выводе.
type statsByGroupReducer.m
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
| datastore
| getnext
| hasnext
| mapreduce