Запись функции карты

Роль функции карты в MapReduce

mapreduce требует и входной функции карты, которая получает фрагменты данных и того выходного промежуточного звена результаты, и вход уменьшает функцию, которая читает, промежуточное звено заканчивается и приводит к конечному результату. Таким образом нормально разбить вычисление в две связанных части для map и reduce функций, чтобы выполнить отдельно. Например, чтобы найти максимальное значение в наборе данных, функция карты может найти максимальное значение в каждом фрагменте входных данных, и затем уменьшать функция может найти одно максимальное значение среди всех промежуточных максимумов.

Эти данные показывают фазу Map алгоритма mapreduce.

Фаза Map алгоритма mapreduce имеет следующие шаги:

  1. mapreduce читает один фрагмент данных с помощью функции read на входном datastore, затем вызывает функцию карты, чтобы работать над фрагментом.

  2. Функция карты затем работает над отдельным фрагментом данных и добавляет одну или несколько пар "ключ-значение" в промежуточный объект KeyValueStore с помощью функций addmulti или add.

  3. 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 пуст.

В дополнение к этим основным требованиям для функции карты пары "ключ-значение", добавленные функцией карты, должны также удовлетворить этим условиям:

  1. Ключи должны быть числовыми скалярами, векторами символов или строками. Числовыми ключами не может быть NaN, комплексный, логический, или разреженный.

  2. Все ключи, добавленные функцией карты, должны иметь тот же класс.

  3. Значения могут быть любым объектом 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.

Смотрите также

| | |

Похожие темы