exponenta event banner

Запись функции уменьшения

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

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

На этом рисунке показана фаза сокращения mapreduce алгоритм.

Этап сокращения mapreduce алгоритм содержит следующие этапы:

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

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

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

  4. После выполнения суммарного расчета функция уменьшения добавляет одну или несколько пар ключ-значение к окончательному KeyValueStore с использованием add и addmulti функции.

Этап сокращения mapreduce алгоритм завершается, когда функция уменьшения обрабатывает все уникальные промежуточные ключи и связанные с ними значения. Результат этой фазы mapreduce алгоритм (аналогичный фазе Map) KeyValueStore объект, содержащий все конечные пары ключ-значение, добавленные функцией уменьшения. После этапа сокращения mapreduce извлекает пары ключ-значение из KeyValueStore и возвращает их в хранилище данных (a KeyValueDatastore по умолчанию). Пары ключ-значение в хранилище выходных данных не отсортированы; они отображаются в том же порядке, что и добавленные функцией уменьшения.

Требования к уменьшению функции

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

Входами для функции уменьшения являются intermKey, intermValIter, и outKVStore:

  • intermKey является одним из уникальных ключей, добавляемых функцией карты. Каждый вызов функции уменьшения на mapreduce задает новый уникальный ключ из ключей в промежуточном KeyValueStore объект.

  • intermValIter является ValueIterator объект, связанный с активным ключом, intermKey. Это ValueIterator содержит все значения, связанные с активным ключом. Прокрутка значений с помощью hasnext и getnext функции.

  • outKVStore является именем для окончательного KeyValueStore объект, к которому функция уменьшения должна добавить пары ключ-значение. add и addmulti функции используют это имя объекта для добавления пар ключ-значение в выходные данные. mapreduce берет выходные пары ключ-значение из outKVStore и возвращает их в хранилище выходных данных, которое является KeyValueDatastore по умолчанию. Если функция уменьшения не добавляет пары ключ-значение к outKVStore, то mapreduce возвращает пустое хранилище данных.

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

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

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

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

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

См. также

| | | | |

Связанные темы