mapreduce
требует и входной функции карты, которая получает фрагменты данных и того выходного промежуточного звена результаты, и вход уменьшает функцию, которая читает, промежуточное звено заканчивается и приводит к конечному результату. Таким образом нормально разбить вычисление в две связанных части для map и reduce функций, чтобы выполнить отдельно. Например, чтобы найти максимальное значение в наборе данных, функция карты может найти максимальное значение в каждом фрагменте входных данных, и затем уменьшать функция может найти одно максимальное значение среди всех промежуточных максимумов.
Эти данные показывают фазу Map алгоритма mapreduce
.
Фаза Map алгоритма mapreduce
имеет следующие шаги:
mapreduce
читает один фрагмент данных с помощью функции read
на входном datastore, затем вызывает функцию карты, чтобы работать над фрагментом.
Функция карты затем работает над отдельным фрагментом данных и добавляет одну или несколько пар "ключ-значение" в промежуточный объект KeyValueStore
с помощью функций addmulti
или add
.
mapreduce
повторяет этот процесс для каждого из фрагментов данных во входном datastore, так, чтобы общее количество вызовов функции карты было равно количеству фрагментов данных. Свойство ReadSize
datastore определяет количество фрагментов данных.
Фаза Map алгоритма mapreduce
завершена когда процессы функции карты каждый из фрагментов данных во входном datastore. Результатом этой фазы алгоритма mapreduce
является объект KeyValueStore
, который содержит все пары "ключ-значение", добавленные функцией карты. После фазы Map mapreduce
готовится к фазе Reduce путем группировки всех значений в объекте KeyValueStore
уникальным ключом.
mapreduce
автоматически вызывает функцию карты для каждого фрагмента данных во входном datastore. Функция карты должна удовлетворить определенные основные требования, чтобы запуститься правильно во время этих автоматических вызовов. Эти требования коллективно гарантируют соответствующее перемещение данных через фазу Map алгоритма mapreduce
.
Входными параметрами к функции карты является data
, info
и intermKVStore
:
data
и info
являются результатом вызова функции read
на входе datastore
, который mapreduce
выполняет автоматически перед каждым вызовом функции карты.
intermKVStore
является именем промежуточного объекта KeyValueStore
, в который функция карты должна добавить пары "ключ-значение". add
и функции addmulti
используют это имя объекта, чтобы добавить пары "ключ-значение". Если функция карты не добавляет пар "ключ-значение" в объект intermKVStore
, то mapreduce
не вызывает уменьшать функцию, и получившийся datastore пуст.
В дополнение к этим основным требованиям для функции карты пары "ключ-значение", добавленные функцией карты, должны также удовлетворить этим условиям:
Ключи должны быть числовыми скалярами, векторами символов или строками. Числовыми ключами не может быть NaN
, комплексный, логический, или разреженный.
Все ключи, добавленные функцией карты, должны иметь тот же класс.
Значения могут быть любым объектом MATLAB®, включая все допустимые типы данных MATLAB.
Вышеупомянутые требования пары "ключ-значение" могут не согласиться при использовании других продуктов с mapreduce
. См. документацию для соответствующего продукта, чтобы получить специфичные для продукта требования пары "ключ-значение".
Эти примеры содержат некоторые функции карты, используемые примерами mapreduce
в папке toolbox/matlab/demos
.
Функция карты, которая просто возвращает то, что mapreduce
передает ей, вызвана единичный картопостроитель. Единичный картопостроитель полезен, чтобы использовать в своих интересах группировку значений уникальным ключом прежде, чем выполнить в вычислениях уменьшать функция. Файл картопостроителя identityMapper.m
является одним из картопостроителей, используемых в файле в качестве примера TSQRMapReduceExample.m
.
type identityMapper.m
function identityMapper(data, info, intermKVStore) % Mapper function for the MapReduce TSQR example. % % This mapper function simply copies the data and add them to the % intermKVStore as intermediate values. % Copyright 2014 The MathWorks, Inc. x = data.Value{:,:}; add(intermKVStore,'Identity', x);
Одним из самых простых примеров неединичного картопостроителя является maxArrivalDelayMapper.m
, который является картопостроителем для файла в качестве примера MaxMapReduceExample.m
. Для каждого фрагмента входных данных этот картопостроитель вычисляет максимальную задержку прибытия и добавляет пару "ключ-значение" в промежуточный KeyValueStore
.
type maxArrivalDelayMapper.m
function maxArrivalDelayMapper (data, info, intermKVStore) % Mapper function for the MaxMapreduceExample. % Copyright 1984-2014 The MathWorks, Inc. % Data is an n-by-1 table of the ArrDelay. As the data source is tabular, % the return of read is a table object. partMax = max(data.ArrDelay); add(intermKVStore, 'PartialMaxArrivalDelay',partMax);
Более усовершенствованным примером картопостроителя является statsByGroupMapper.m
, который является картопостроителем для файла в качестве примера StatisticsByGroupMapReduceExample.m
. Этот картопостроитель использует вложенную функцию, чтобы вычислить несколько статистических количеств (количество, среднее значение, отклонение, и так далее) для каждого фрагмента входных данных, и затем добавляет несколько пар "ключ-значение" в промежуточный объект KeyValueStore
. Кроме того, этот картопостроитель использует четыре входных параметра, тогда как mapreduce
только принимает функцию карты с тремя входными параметрами. Чтобы обойти это, передайте в дополнительном параметре с помощью анонимной функции во время вызова mapreduce
, как обрисовано в общих чертах в примере.
type statsByGroupMapper.m
function statsByGroupMapper(data, ~, intermKVStore, groupVarName) % Mapper function for the StatisticsByGroupMapReduceExample. % Copyright 2014 The MathWorks, Inc. % Data is a n-by-3 table. Remove missing values first delays = data.ArrDelay; groups = data.(groupVarName); notNaN =~isnan(delays); groups = groups(notNaN); delays = delays(notNaN); % find the unique group levels in this chunk [intermKeys,~,idx] = unique(groups, 'stable'); % group delays by idx and apply @grpstatsfun function to each group intermVals = accumarray(idx,delays,size(intermKeys),@grpstatsfun); addmulti(intermKVStore,intermKeys,intermVals); function out = grpstatsfun(x) n = length(x); % count m = sum(x)/n; % mean v = sum((x-m).^2)/n; % variance s = sum((x-m).^3)/n; % skewness without normalization k = sum((x-m).^4)/n; % kurtosis without normalization out = {[n, m, v, s, k]};
Для получения дополнительной информации об общих шаблонах программирования в карте или уменьшайте функции, смотрите Сборку Эффективные Алгоритмы с MapReduce.
add
| addmulti
| datastore
| mapreduce