mapreduce
требует и входной функции карты, которая получает блоки данных и то выходное промежуточное звено результаты, и вход уменьшает функцию, которая читает, промежуточное звено заканчивается и приводит к конечному результату. Таким образом нормально разбить вычисление в две связанных части для map и reduce функций, чтобы выполнить отдельно. Например, чтобы найти максимальное значение в наборе данных, функция карты может найти максимальное значение в каждом блоке входных данных, и затем уменьшать функция может найти одно максимальное значение среди всех промежуточных максимумов.
Этот рисунок показывает фазу Reduce mapreduce
алгоритм.
Фаза Reduce mapreduce
алгоритм имеет следующие шаги:
Результат фазы Map mapreduce
алгоритмом является промежуточный KeyValueStore
объект, который содержит все пары "ключ-значение", добавленные функцией карты. Прежде, чем вызвать уменьшать функцию, mapreduce
группирует значения в промежуточном KeyValueStore
объект уникальным ключом. Каждый уникальный ключ в промежуточном KeyValueStore
возразите результатам в одном вызове уменьшать функции.
Для каждого ключа, mapreduce
создает ValueIterator
объект, который содержит все значения, сопоставленные с тем ключом.
Уменьшать функция просматривает значения путем прокрутки от ValueIterator
объект с помощью hasnext
и getnext
функции, которые обычно используются в while
цикл.
После выполнения итогового вычисления уменьшать функция добавляет одну или несколько пар "ключ-значение" в итоговый KeyValueStore
объект с помощью add
и addmulti
функции.
Фаза 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
объект содержит все значения, сопоставленные с активным ключом. Просмотрите значения путем прокрутки с помощью hasnext
и getnext
функции.
outKVStore
имя для итогового KeyValueStore
возразите, в который уменьшать функция должна добавить пары "ключ-значение". add
и addmulti
функции используют это имя объекта, чтобы добавить пары "ключ-значение" в выход. mapreduce
берет выходные пары "ключ-значение" из outKVStore
и возвращает их в выходном datastore, который является KeyValueDatastore
объект по умолчанию. Если уменьшать функция не добавляет пар "ключ-значение" в outKVStore
то mapreduce
возвращает пустой datastore.
В дополнение к этим основным требованиям для уменьшать функции пары "ключ-значение", добавленные уменьшать функцией, должны также удовлетворить этим условиям:
Ключи должны быть числовыми скалярами, векторами символов или строками. Числовыми ключами не может быть NaN
, логический, комплексный, или разреженный.
Все ключи, добавленные уменьшать функцией, должны иметь тот же класс, но тот класс может отличаться от класса ключей, добавленных функцией карты.
Если OutputType
аргумент mapreduce
'Binary'
(значение по умолчанию), затем значение, добавленное уменьшать функцией, может быть любым объектом MATLAB®, включая все допустимые типы данных MATLAB.
Если OutputType
аргумент mapreduce
'TabularText'
, затем значение, добавленное уменьшать функцией, может быть числовым скаляром, вектором символов или строкой. В этом случае значением не может быть NaN
, комплексный, логический, или разреженный.
Примечание
Вышеупомянутые требования пары "ключ-значение" могут не согласиться при использовании других продуктов с mapreduce
. См. документацию для соответствующего продукта, чтобы получить специфичные для продукта требования пары "ключ-значение".
Вот, некоторые иллюстративные уменьшают функции, используемые в mapreduce
примеры.
Одним из самых простых примеров редуктора является maxArrivalDelayReducer
, который является редуктором для примера, Находят Максимальное значение с MapReduce. Функция карты в этом примере находит максимальную задержку прибытия каждого фрагмента входных данных. Затем уменьшать функция закончила задачу путем нахождения одного максимального значения среди всех промежуточных максимумов. Чтобы найти максимальное значение, редуктор просматривает значения путем прокрутки в ValueIterator
возразите и сравнивает каждое значение с текущим максимумом. mapreduce
только вызывает эту функцию редуктора однажды, поскольку картопостроитель добавляет один уникальный ключ в промежуточный KeyValueStore
объект. Уменьшать функция добавляет одну пару "ключ-значение" в выход.
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. Функция карты в этом примере группирует данные в каждом входе с помощью дополнительного параметра (поставщик услуг авиакомпании, месяц, и так далее), и затем вычисляет несколько статистических количеств для каждой группы данных. Уменьшать функция закончила задачу путем получения статистических количеств и конкатенации их в длинные векторы, и затем использования векторов, чтобы вычислить итоговые статистические количества для количества, среднего значения, отклонения, скошенности и эксцесса. Редуктор хранит эти значения как поля в структуре, так, чтобы каждый уникальный ключ имел структуру статистических количеств в выходе.
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