Как номер и тип устройств сбора данных ежегодно растет, чистый размер и уровень собранных данных быстро расширяются. Эти большие наборы данных могут содержать гигабайты или терабайты данных, и могут вырасти на порядке мегабайтов или гигабайтов в день. В то время как набор этой информации представляет возможности для понимания, это также представляет собой много проблем. Большинство алгоритмов не спроектировано, чтобы обработать большие наборы данных за разумное количество времени или с разумным объемом памяти. 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
объект по одному. Затем после агрегации промежуточного звена следует из функции карты, уменьшать функция добавляет итоговые пары "ключ-значение" в выход с помощью add
и addmulti
функции. Порядок ключей в выходе совпадает с порядком, в котором уменьшать функция добавляет их в итоговый 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' } 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
на datastore, чтобы получить данные, чтобы передать функции карты. Поэтому можно использовать SelectedVariableNames
SelectedFormats
, и ReadSize
опции, чтобы непосредственно сконфигурировать размер блока и тип данных, что mapreduce
передачи в функцию карты.
Например, чтобы выбрать Distance
(общее расстояние рейса) переменная как единственная переменная интереса, задайте SelectedVariableNames
.
ds.SelectedVariableNames = 'Distance';
Теперь каждый раз, когда read
readall
, или preview
функции действуют на ds
, они возвратят только информацию для Distance
переменная. Чтобы подтвердить это, можно предварительно просмотреть первые несколько строк данных в datastore. Это позволяет вам исследовать формат данных что mapreduce
функция передаст функции карты.
preview(ds)
ans = 8×1 table Distance ________ 308 296 480 296 373 308 447 954
Просмотреть точные данные что mapreduce
передаст функции карты, использовать read
.
Для получения дополнительной информации и полных сводных данных доступных параметров, смотрите Datastore.
mapreduce
функционируйте автоматически вызывает map и reduce функции во время выполнения, таким образом, эти функции должны удовлетворить определенные требования, чтобы запуститься правильно.
Входными параметрами к функции карты является data
информация
, и 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
объект содержит все значения, сопоставленные с активным ключом. Просмотрите значения путем прокрутки с помощью hasnext
и getnext
функции.
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 функций смотрите Запись Функция Карты и Запись Уменьшать Функция.
Выполнение mapreduce
После того, как у вас будут datastore, функция карты и уменьшать функция, можно вызвать 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
функционируйте, чтобы считать пары "ключ-значение" из выходного datastore.
readall(outds)
ans = 1×2 table Key Value ________ ____________ {'Mean'} {[702.1630]}
mapreduce
| tabularTextDatastore