Как номер и тип устройств сбора данных ежегодно растет, чистый размер и уровень собранных данных быстро расширяются. Эти большие наборы данных могут содержать гигабайты или терабайты данных, и могут вырасти на порядке мегабайтов или гигабайтов в день. В то время как набор этой информации представляет возможности для понимания, это также представляет собой много проблем. Большинство алгоритмов не разработано, чтобы обработать большие наборы данных за разумное количество времени или с разумным объемом памяти. MapReduce позволяет вам справляться со многими из этих проблем получить важную информацию от больших наборов данных.
MapReduce является методом программирования для анализа наборов данных, которые не умещаются в памяти. Можно быть знакомы с MapReduce Hadoop®, который является популярной реализацией, которая работает с Распределенной файловой системой Hadoop (HDFS™). MATLAB® обеспечивает немного отличающуюся реализацию метода MapReduce с функцией mapreduce
.
mapreduce
использует datastore, чтобы обработать данные в маленьких фрагментах, которые индивидуально вписываются в память. Каждый фрагмент проходит фазу Карты, которая форматирует данные, которые будут обработаны. Затем промежуточные фрагменты данных проходят Уменьшать фазу, которая агрегировала промежуточные результаты привести к конечному результату. Карта и Уменьшает фазы, закодированы картой и уменьшают функции, которые являются первичными входными параметрами к mapreduce
. Существуют бесконечные комбинации карты и уменьшают функции, чтобы обработать данные, таким образом, этот метод и гибок и чрезвычайно мощен для занятия большими задачами обработки данных.
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 для набора данных. Наряду с картой и уменьшают функции, 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
автоматически вызывает карту, и уменьшите функции во время выполнения, таким образом, эти функции должны удовлетворить определенные требования, чтобы запуститься правильно.
Входными параметрами к функции карты является 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
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
m.
Для получения информации о записи более усовершенствованной карты и уменьшите функции, смотрите Запись Функция Карты и Запись Уменьшать Функция.
После того, как у вас будут datastore, функция карты и уменьшать функция, можно вызвать mapreduce
, чтобы выполнить вычисление. Чтобы вычислить среднее расстояние полета в наборе данных, вызовите mapreduce
с помощью ds
, MeanDistMapFun.m
и MeanDistReduceFun.m
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]