Как номер и тип устройств сбора данных ежегодно растет, чистый размер и уровень собранных данных быстро расширяются. Эти большие наборы данных могут содержать гигабайты или терабайты данных, и могут вырасти на порядке мегабайтов или гигабайтов в день. В то время как набор этой информации представляет возможности для понимания, это также представляет собой много проблем. Большинство алгоритмов не разработано, чтобы обработать большие наборы данных за разумное количество времени или с разумным объемом памяти. MapReduce позволяет вам справляться со многими из этих проблем получить важную информацию от больших наборов данных.
MapReduce является методом программирования для анализа наборов данных, которые не умещаются в памяти. Можно быть знакомы с MapReduce Hadoop®, который является популярной реализацией, которая работает с Распределенной файловой системой Hadoop (HDFS™). MATLAB® обеспечивает немного отличающуюся реализацию метода MapReduce с функцией mapreduce
.
mapreduce
использует datastore, чтобы обработать данные в маленьких фрагментах, которые индивидуально помещаются в память. Каждый фрагмент проходит фазу Map, которая форматирует данные, которые будут обработаны. Затем промежуточные фрагменты данных проходят фазу Reduce, которая агрегировала промежуточные результаты привести к конечному результату. Фазы Map и Reduce закодированы map и reduce функциями, которые являются первичными входными параметрами к mapreduce
. Существуют бесконечные комбинации map и reduce функций, чтобы обработать данные, таким образом, этот метод и гибок и чрезвычайно мощен для решения больших задач обработки данных.
mapreduce
поддается расширению, чтобы запуститься в нескольких средах. Для получения дополнительной информации об этих возможностях, смотрите, Убыстряются и Развертывают MapReduce Используя Другие продукты.
Утилита функции mapreduce
находится в ее способности выполнить вычисления на большом количестве данных. Таким образом mapreduce
не является подходящим для выполнения вычислений на нормальных размерных наборах данных, которые могут загрузиться непосредственно в память компьютера и анализируются с традиционными методами. Вместо этого используйте mapreduce
, чтобы выполнить статистический или аналитический метод расчета на наборе данных, который не умещается в памяти.
Каждый вызов карты или уменьшает функцию mapreduce
, независимо от всех других. Например, вызов функции карты не может зависеть от входных параметров или следует из предыдущего вызова функции карты. Лучше разбивать такие вычисления во множественные вызовы mapreduce
.
mapreduce
перемещает каждый фрагмент данных во входном datastore через несколько фаз прежде, чем достигнуть окончательного результата. Следующая фигура обрисовывает в общих чертах фазы алгоритма для mapreduce
.
Алгоритм имеет следующие шаги:
mapreduce
читает фрагмент данных из входного datastore с помощью [data,info] = read(ds)
, и затем вызывает функцию карты, чтобы работать над тем фрагментом.
Функция карты получает фрагмент данных, организует его или выполняет предшествующее вычисление, и затем использует add
и функции addmulti
, чтобы добавить, что пары "ключ-значение" к промежуточному объекту хранения данных вызвали KeyValueStore
. Количество вызовов функции карты mapreduce
равно количеству фрагментов во входном datastore.
После того, как функция карты работает надо всеми фрагментами данных в datastore, группы mapreduce
все значения в промежуточном объекте KeyValueStore
уникальным ключом.
Затем, mapreduce
вызывает уменьшать функцию однажды для каждого уникального ключа, добавленного функцией карты. Каждый уникальный ключ может иметь много присваиваемых значений. mapreduce
передает значения уменьшать функции как объект ValueIterator
, который является объектом, используемым, чтобы выполнить итерации по значениям. Объект ValueIterator
для каждого уникального ключа содержит все присваиваемые значения для того ключа.
Уменьшать функция использует hasnext
и функции getnext
, чтобы выполнить итерации через значения в объекте ValueIterator
по одному. Затем после агрегации промежуточного звена следует из функции карты, уменьшать функция добавляет итоговые пары "ключ-значение" в вывод с помощью функций addmulti
и add
. Порядок ключей в выводе совпадает с порядком, в котором уменьшать функция добавляет их в итоговый объект KeyValueStore
. Таким образом, mapreduce
явным образом не сортирует вывод.
Уменьшать функция пишет итоговые пары "ключ-значение" в итоговый объект KeyValueStore
. От этого объекта mapreduce
вытягивает пары "ключ-значение" в выходной datastore, который является объектом KeyValueDatastore
по умолчанию.
Этот пример использует простое вычисление (среднее значение путешествуют на расстояние в наборе полетных данных) проиллюстрировать, что шаги должны были запустить mapreduce
.
Первый шаг к использованию mapreduce
должен создать datastore для набора данных. Наряду с map и reduce функциями, datastore для набора данных является необходимым входом к mapreduce
, поскольку это позволяет mapreduce
обрабатывать данные во фрагментах.
mapreduce
работает с большинством типов хранилищ данных. Например, создайте объект TabularTextDatastore
для набора данных airlinesmall.csv
.
ds = tabularTextDatastore('airlinesmall.csv','TreatAsMissing','NA') ds = TabularTextDatastore with properties: Files: { ' ...\matlab\toolbox\matlab\demos\airlinesmall.csv' } FileEncoding: 'UTF-8' AlternateFileSystemRoots: {} 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
Несколько из ранее описанных опций полезны в контексте mapreduce
. Функция mapreduce
выполняет read
на datastore
, чтобы получить данные, чтобы передать функции карты. Поэтому можно использовать SelectedVariableNames
, SelectedFormats
и опции ReadSize
, чтобы непосредственно сконфигурировать размер фрагмента и тип данных, которые mapreduce
передает функции карты.
Например, чтобы выбрать Distance
(общее расстояние рейса) переменная как единственная переменная интереса, задайте SelectedVariableNames
.
ds.SelectedVariableNames = 'Distance';
Теперь, каждый раз, когда read
, readall
или preview
функционируют действие на ds
, они возвратят только информацию для переменной Distance
. Чтобы подтвердить это, можно предварительно просмотреть первые несколько строк данных в datastore. Это позволяет вам исследовать формат данных, которые функция mapreduce
передаст функции карты.
preview(ds) ans = Distance ________ 308 296 480 296 373 308 447 954
Чтобы просмотреть точные данные, которые mapreduce
передаст функции карты, используйте read
.
Для получения дополнительной информации и полных сводных данных доступных параметров, смотрите Datastore.
Функция mapreduce
автоматически вызывает map и reduce функции во время выполнения, таким образом, эти функции должны удовлетворить определенные требования, чтобы запуститься правильно.
Входными параметрами к функции карты является data
, info
и intermKVStore
:
data
и info
являются результатом вызова функции read
на входе datastore
, который mapreduce
выполняет автоматически перед каждым вызовом функции карты.
intermKVStore
является именем промежуточного объекта KeyValueStore
, в который функция карты должна добавить пары "ключ-значение". add
и функции addmulti
используют это имя объекта, чтобы добавить пары "ключ-значение". Если ни один из вызовов функции карты не добавляет пары "ключ-значение" в intermKVStore
, то mapreduce
не вызывает уменьшать функцию, и получившийся datastore пуст.
Простой пример функции карты:
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
содержит все значения, сопоставленные с активным ключом. Просмотрите значения путем прокрутки с помощью функций getnext
и hasnext
.
outKVStore
является именем для итогового объекта KeyValueStore
, в который уменьшать функция должна добавить пары "ключ-значение". mapreduce
берет выходные пары "ключ-значение" из outKVStore
и возвращает их в выводе datastore
, который является объектом KeyValueDatastore
по умолчанию. Если ни один из вызовов уменьшать функции не добавляет пары "ключ-значение" в outKVStore
, то mapreduce
возвращает пустой datastore.
Простой пример уменьшать функции:
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
.
Для получения информации о записи более усовершенствованных map и reduce функций смотрите Запись Функция Карты и Запись Уменьшать Функция.
После того, как у вас будут datastore, функция карты и уменьшать функция, можно вызвать mapreduce
, чтобы выполнить вычисление. Чтобы вычислить среднее расстояние рейса в наборе данных, вызовите mapreduce
с помощью ds
, MeanDistMapFun.m
и MeanDistReduceFun.m
.
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 100%
По умолчанию функция mapreduce
отображает информацию о прогрессе в командной строке и возвращает объект KeyValueDatastore
, который указывает на файлы в текущей папке. Можно настроить все три из этих опций с помощью аргументов пары Name,Value
для 'OutputFolder'
, 'OutputType'
и 'Display'
. Для получения дополнительной информации смотрите страницу с описанием для mapreduce
.
Используйте функцию readall
, чтобы считать пары "ключ-значение" из выходного datastore.
readall(outds) ans = Key Value ______ __________ 'Mean' [702.1630]