mapreduce
требует как входную функцию карты, которая получает блоки данных и которая выводит промежуточные результаты, так и входную функцию сокращения, которая читает промежуточные результаты и приводит к конечному результату. Таким образом, нормально разбивать вычисление на две связанные части для карты и уменьшать функции для выполнения отдельно. Для примера, чтобы найти максимальное значение в наборе данных, функция map может найти максимальное значение в каждом блоке входных данных, и тогда функция reduce может найти одно максимальное значение среди всех промежуточных максимумов.
Этот рисунок показывает фазу Map mapreduce
алгоритм.
Фаза Map mapreduce
алгоритм имеет следующие шаги:
mapreduce
считывает один блок данных с помощью read
функция на входе datastore, затем вызывает функцию map для работы с блоком.
Функция map затем работает с отдельным блоком данных и добавляет одну или несколько пары "ключ-значение" к промежуточному KeyValueStore
использование объекта add
или addmulti
функций.
mapreduce
повторяет этот процесс для каждого из блоков данных в вход datastore, так что общее количество вызовов функции map равно количеству блоков данных. The ReadSize
свойство datastore определяет количество блоков данных.
Фаза Map mapreduce
алгоритм завершен, когда функция map обрабатывает каждый из блоков данных в вход datastore. Результат этой фазы mapreduce
алгоритм является KeyValueStore
объект, который содержит все пары "ключ-значение", добавленные функцией map. После фазы Map, mapreduce
готовится к фазе Reduce путем группировки всех значений в KeyValueStore
объект уникальным ключом.
mapreduce
автоматически вызывает функцию map для каждого блока данных в вход datastore. Функция map должна удовлетворять определенным основным требованиям для правильного запуска во время этих автоматических вызовов. Эти требования коллективно обеспечивают надлежащее перемещение данных через фазу Map mapreduce
алгоритм.
Входы в функцию map data
, info
, и intermKVStore
:
data
и info
являются результатом вызова на read
функцию на входе datastore, которая mapreduce
выполняется автоматически перед каждым вызовом функции map.
intermKVStore
- имя промежуточного KeyValueStore
объект, к которому функция map должна добавить пар "ключ-значение". add
и addmulti
функции используют это имя объекта для добавления пар "ключ-значение". Если функция map не добавляет пар "ключ-значение" к intermKVStore
объект, затем mapreduce
не вызывает функцию reduce, и полученный datastore пуст.
В дополнение к этим основным требованиям к функции map, пары "ключ-значение", добавленные функцией map, должны также удовлетворять этим условиям:
Ключи должны быть числовыми скалярами, векторами символов или строками. Числовые ключи не могут быть NaN
, сложный, логический или разреженный.
Все ключи, добавленные функцией map, должны иметь один и тот же класс.
Значения могут быть любыми MATLAB® объект, включая все допустимые типы данных MATLAB.
Примечание
Вышеуказанные требования к паре "ключ-значение" могут отличаться при использовании других продуктов с mapreduce
. Ознакомьтесь с документацией по соответствующему продукту, чтобы получить требования к паре "ключ-значение" продукта.
Вот несколько иллюстративных функций карты, используемых в mapreduce
примеры.
Функция map, которая просто возвращает то, что mapreduce
проходит к нему называются тождества mapper. Identity mapper полезен, чтобы использовать преимущества группировки значений по уникальному ключу перед выполнением вычислений в функции reduce. The identityMapper
mapper файла является одним из mapper, используемых в примере Tall Skinny QR (TSQR) Matrix Факторизации Использование MapReduce.
function identityMapper(data, info, intermKVStore) % This mapper function simply copies the data and add them to the % intermKVStore as intermediate values. x = data.Value{:,:}; add(intermKVStore,'Identity', x); end
Одним из простейших примеров отображения нетождеств является maxArrivalDelayMapper
, который является отображателем для примера Найти максимальное значение с MapReduce. Для каждого фрагмента входных данных этот mapper вычисляет максимальную задержку прибытия и добавляет пару "ключ-значение" к промежуточному KeyValueStore
.
function maxArrivalDelayMapper (data, info, intermKVStore) partMax = max(data.ArrDelay); add(intermKVStore, 'PartialMaxArrivalDelay',partMax); end
Более продвинутый пример mapper statsByGroupMapper
, который является отображателем для примера Вычисление сводной статистики по группам с использованием MapReduce. Этот mapper использует вложенную функцию, чтобы вычислить несколько статистических величин (количество, среднее значение, отклонение и так далее) для каждого фрагмента входных данных, а затем добавляет несколько пары "ключ-значение" к промежуточному KeyValueStore
объект. Кроме того, этот mapper использует четыре входных параметров, тогда как mapreduce
принимает только функцию map с тремя входными параметрами. Чтобы обойти это, передайте в дополнительном параметре с помощью анонимной функции во время вызова на mapreduce
, как показано в примере.
function statsByGroupMapper(data, ~, intermKVStore, groupVarName) % 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]}; end end
Для получения дополнительной информации об общих шаблонах программирования в карте или сокращении функций, смотрите Создайте Эффективные Алгоритмы с MapReduce.
add
| addmulti
| mapreduce
| tabularTextDatastore