Написание функции сокращения

Роль функции сокращения в MapReduce

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

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

Фаза Сокращения mapreduce алгоритм имеет следующие шаги:

  1. Результат фазы Map mapreduce алгоритм является промежуточным KeyValueStore объект, который содержит все пары "ключ-значение", добавленные функцией map. Перед вызовом функции сокращения, mapreduce группирует значения в промежуточных KeyValueStore объект уникальным ключом. Каждый уникальный ключ в промежуточном KeyValueStore объект приводит к одному вызову функции сокращения.

  2. Для каждого ключа, mapreduce создает ValueIterator объект, который содержит все значения, связанные с этим ключом.

  3. Функция reduce прокручивает значения из ValueIterator использование объекта hasnext и getnext функции, которые обычно используются в while цикл.

  4. После выполнения суммарного вычисления функция 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, должны также удовлетворять этим условиям:

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

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

  3. Если на OutputType аргумент mapreduce является 'Binary' (по умолчанию), тогда значение, добавленное функцией reduce, может быть любым MATLAB® объект, включая все допустимые типы данных MATLAB.

  4. Если на 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.

См. также

| | | | |

Похожие темы