По мере того, как количество и тип устройств сбора данных растет ежегодно, объем и скорость сбора данных быстро растут. Эти наборы больших данных могут содержать гигабайты или терабайты данных и могут расти порядка мегабайт или гигабайт в день. Хотя сбор этой информации открывает возможности для понимания, он также сопряжен со многими проблемами. Большинство алгоритмов не предназначены для обработки наборов больших данных в разумное время или с разумным объемом памяти. MapReduce позволяет решить многие из этих задач, чтобы получить важную информацию из больших наборов данных.
MapReduce - метод программирования для анализа наборов данных, не вписывающихся в память. Возможно, вы знакомы с Hadoop ® MapReduce, который является популярной реализацией, работающей с распределенной файловой системой Hadoop (HDFS™). MATLAB ® обеспечивает несколько иную реализацию методики MapReduce с помощью mapreduce функция.
mapreduce использует хранилище данных для обработки данных в небольших блоках, которые по отдельности помещаются в память. Каждый блок проходит фазу Map, которая форматирует обрабатываемые данные. Затем промежуточные блоки данных проходят фазу сокращения, которая агрегирует промежуточные результаты для получения конечного результата. Фазы Map и Reduct кодируются функциями map и reduct, которые являются основными входами для mapreduce. Существуют бесконечные комбинации функций отображения и сокращения для обработки данных, поэтому этот метод является гибким и чрезвычайно мощным для решения больших задач обработки данных.
mapreduce может быть расширен для работы в нескольких средах. Дополнительные сведения об этих возможностях см. в разделе Ускорение и развертывание MapReduce с использованием других продуктов.
Полезность mapreduce функция заключается в способности выполнять вычисления на больших коллекциях данных. Таким образом, mapreduce не подходит для выполнения вычислений с наборами данных нормального размера, которые могут быть загружены непосредственно в компьютерную память и проанализированы традиционными методами. Вместо этого используйте mapreduce для выполнения статистического или аналитического вычисления для набора данных, который не помещается в память.
Каждый вызов карты или уменьшение функции на mapreduce не зависит от всех остальных. Например, вызов функции отображения не может зависеть от входных данных или результатов предыдущего вызова функции отображения. Лучше всего разбить такие вычисления на несколько вызовов mapreduce.
mapreduce перемещает каждый блок данных во входном хранилище данных через несколько фаз, прежде чем получить окончательный вывод. На следующем рисунке показаны фазы алгоритма для mapreduce.

Алгоритм состоит из следующих этапов:
mapreduce считывает блок данных из хранилища входных данных с помощью [data,info] = read(ds)затем вызывает функцию карты для работы с этим блоком.
Функция отображения получает блок данных, организует его или выполняет предварительный расчет, а затем использует add и addmulti функции для добавления пар ключ-значение к промежуточному объекту хранения данных, называемому KeyValueStore. Количество вызовов функции отображения по mapreduce равно количеству блоков во входном хранилище данных.
После того, как функция карты будет работать со всеми блоками данных в хранилище данных, mapreduce группирует все значения в промежуточном KeyValueStore по уникальному ключу.
Далее, mapreduce вызывает функцию уменьшения один раз для каждого уникального ключа, добавленного функцией отображения. Каждый уникальный ключ может иметь множество связанных значений. mapreduce передает значения функции уменьшения как ValueIterator , который является объектом, используемым для итерации значений. ValueIterator объект для каждого уникального ключа содержит все связанные значения для этого ключа.
Функция уменьшения использует hasnext и getnext для итерации через значения в ValueIterator объект по одному. Затем, после агрегирования промежуточных результатов из функции отображения, функция уменьшения добавляет окончательные пары ключ-значение к выходу с использованием add и addmulti функции. Порядок клавиш на выходе совпадает с порядком, в котором функция уменьшения добавляет их к окончательному KeyValueStore объект. То есть mapreduce не выполняет явную сортировку выходных данных.
Примечание
Функция уменьшения записывает окончательные пары ключ-значение в окончательный KeyValueStore объект. Из этого объекта, mapreduce извлекает пары ключ-значение в хранилище выходных данных, которое является KeyValueDatastore по умолчанию.
В этом примере используется простой расчет (среднее расстояние перемещения в наборе данных полета) для иллюстрации шагов, необходимых для выполнения mapreduce.
Первый шаг к использованию mapreduce - создание хранилища данных для набора данных. Наряду с функциями отображения и сокращения, хранилище данных для набора данных является обязательным входом для mapreduce, поскольку это позволяет mapreduce для обработки данных в блоках.
mapreduce работает с большинством типов хранилищ данных. Например, создайте TabularTextDatastore объект для airlinesmall.csv набор данных.
ds = tabularTextDatastore('airlinesmall.csv','TreatAsMissing','NA')
ds =
TabularTextDatastore with properties:
Files: {
' ...\matlab\toolbox\matlab\demos\airlinesmall.csv'
}
Folders: {
' ...\matlab\toolbox\matlab\demos'
}
FileEncoding: 'UTF-8'
AlternateFileSystemRoots: {}
PreserveVariableNames: false
ReadVariableNames: true
VariableNames: {'Year', 'Month', 'DayofMonth' ... and 26 more}
DatetimeLocale: en_US
Text Format Properties:
NumHeaderLines: 0
Delimiter: ','
RowDelimiter: '\r\n'
TreatAsMissing: 'NA'
MissingValue: NaN
Advanced Text Format Properties:
TextscanFormats: {'%f', '%f', '%f' ... and 26 more}
TextType: 'char'
ExponentCharacters: 'eEdD'
CommentStyle: ''
Whitespace: ' \b\t'
MultipleDelimitersAsOne: false
Properties that control the table returned by preview, read, readall:
SelectedVariableNames: {'Year', 'Month', 'DayofMonth' ... and 26 more}
SelectedFormats: {'%f', '%f', '%f' ... and 26 more}
ReadSize: 20000 rows
OutputType: 'table'
RowTimes: []
Write-specific Properties:
SupportedOutputFormats: ["txt" "csv" "xlsx" "xls" "parquet" "parq"]
DefaultOutputFormat: "txt"Некоторые из описанных выше вариантов полезны в контексте mapreduce. mapreduce функция выполняет read в хранилище данных для извлечения данных для передачи функции сопоставления. Поэтому вы можете использовать SelectedVariableNames, SelectedFormats, и ReadSize параметры для непосредственного конфигурирования размера блока и типа данных, которые mapreduce передается функции карты.
Например, чтобы выбрать Distance (общее расстояние полета) переменная как единственная интересующая переменная, укажите SelectedVariableNames.
ds.SelectedVariableNames = 'Distance';Теперь, когда read, readall, или preview функции действуют на ds, они вернут только информацию для Distance переменная. Чтобы подтвердить это, можно просмотреть первые несколько строк данных в хранилище данных. Это позволяет проверить формат данных, которые mapreduce функция передается функции карты.
preview(ds)
ans =
8×1 table
Distance
________
308
296
480
296
373
308
447
954 Просмотр точных данных, mapreduce перейдет к функции карты, используйте read.
Дополнительные сведения и полный обзор доступных параметров см. в разделе Хранилище данных.
mapreduce функция автоматически вызывает карту и сокращает функции во время выполнения, поэтому эти функции должны соответствовать определенным требованиям для правильного выполнения.
Входные данные функции карты: data, info, и intermKVStore:
data и info являются результатом вызова read функция в хранилище входных данных, которая mapreduce выполняется автоматически перед каждым вызовом функции отображения.
intermKVStore - имя промежуточного KeyValueStore объект, к которому функция отображения должна добавить пары ключ-значение. add и addmulti функции используют это имя объекта для добавления пар ключ-значение. Если ни один из вызовов функции отображения не добавляет пары ключ-значение в intermKVStore, то mapreduce не вызывает функцию уменьшения, и результирующее хранилище данных пусто.
Простой пример функции карты:
function MeanDistMapFun(data, info, intermKVStore) distances = data.Distance(~isnan(data.Distance)); sumLenValue = [sum(distances) length(distances)]; add(intermKVStore, 'sumAndLength', sumLenValue); end
Эта функция отображения имеет только три строки, которые выполняют некоторые простые роли. Первая строка отфильтровывает все NaN значения в блоке данных расстояния. Вторая строка создает двухэлементный вектор с общим расстоянием и подсчетом для блока, а третья строка добавляет этот вектор значений к intermKVStore с ключом, 'sumAndLength'. После выполнения этой функции отображения на всех блоках данных в ds, intermKVStore объект содержит общее расстояние и счетчик для каждого блока данных расстояния.
Сохранить эту функцию в текущей папке как MeanDistMapFun.m.
Входами для функции уменьшения являются intermKey, intermValIter, и outKVStore:
intermKey для активного ключа, добавленного функцией отображения. Каждый вызов функции уменьшения на mapreduce задает новый уникальный ключ из ключей в промежуточном KeyValueStore объект.
intermValIter является ValueIterator связанный с активным ключом, intermKey. Это ValueIterator содержит все значения, связанные с активным ключом. Прокрутка значений с помощью hasnext и getnext функции.
outKVStore является именем для окончательного KeyValueStore объект, к которому функция уменьшения должна добавить пары ключ-значение. mapreduce берет выходные пары ключ-значение из outKVStore и возвращает их в хранилище выходных данных, которое является KeyValueDatastore по умолчанию. Если ни один из вызовов функции уменьшения не добавляет пары ключ-значение в outKVStore, то mapreduce возвращает пустое хранилище данных.
Простой пример функции уменьшения:
function MeanDistReduceFun(intermKey, intermValIter, outKVStore) sumLen = [0 0]; while hasnext(intermValIter) sumLen = sumLen + getnext(intermValIter); end add(outKVStore, 'Mean', sumLen(1)/sumLen(2)); end
Это уменьшает циклы функций через каждое из значений расстояния и счета в intermValIterПосле этого цикла функция уменьшения вычисляет общее среднее расстояние полета с простым разделением, а затем добавляет одну клавишу к outKVStore.
Сохранить эту функцию в текущей папке как MeanDistReduceFun.m.
Сведения о написании дополнительных функций отображения и сокращения см. в разделах Запись функции отображения и Запись функции уменьшения.
mapreduceПосле создания хранилища данных, функции карты и функции сокращения можно вызвать mapreduce для выполнения расчета. Для расчета среднего расстояния полета в наборе данных вызовите mapreduce использование ds, MeanDistMapFun, и MeanDistReduceFun.
outds = mapreduce(ds, @MeanDistMapFun, @MeanDistReduceFun);
******************************** * MAPREDUCE PROGRESS * ******************************** Map 0% Reduce 0% Map 16% Reduce 0% Map 32% Reduce 0% Map 48% Reduce 0% Map 65% Reduce 0% Map 81% Reduce 0% Map 97% Reduce 0% Map 100% Reduce 0% Map 100% Reduce 100%
По умолчанию mapreduce функция отображает информацию о ходе выполнения в командной строке и возвращает KeyValueDatastore объект, указывающий на файлы в текущей папке. Можно настроить все три эти опции с помощью Name,Value аргументы пары для 'OutputFolder', 'OutputType', и 'Display'. Дополнительные сведения см. на справочной странице для mapreduce.
Используйте readall для считывания пар ключ-значение из хранилища выходных данных.
readall(outds)
ans =
1×2 table
Key Value
________ ____________
{'Mean'} {[702.1630]}mapreduce | tabularTextDatastore