mapReduce

Метод программирования для анализа наборов данных, которые не умещаются в памяти

Синтаксис

outds = mapreduce(ds,mapfun,reducefun)
outds = mapreduce(ds,mapfun,reducefun,mr)
outds = mapreduce(___,Name,Value)

Описание

пример

outds = mapreduce(ds,mapfun,reducefun) применяет функцию карты mapfun, чтобы ввести datastore ds, и затем передает значения, сопоставленные с каждым уникальным ключом, чтобы уменьшать функциональный reducefun. Выходной datastore является объектом KeyValueDatastore, который указывает на файлы .mat в текущей папке.

outds = mapreduce(ds,mapfun,reducefun,mr) опционально задает параметры конфигурации во время выполнения для mapreduce. Вход mr является результатом вызова функции mapreducer. Как правило, этот аргумент используется с Parallel Computing Toolbox™, MATLAB® Parallel Server™ или MATLAB Compiler™. Для получения дополнительной информации смотрите, Убыстряются и Развертывают MapReduce Используя Другие продукты.

outds = mapreduce(___,Name,Value) задает дополнительные опции с одним или несколькими аргументами пары Name,Value с помощью любого из предыдущих синтаксисов. Например, можно задать 'OutputFolder', сопровождаемый вектором символов, задающим путь к выходной папке.

Примеры

свернуть все

Используйте mapreduce, чтобы считать количество рейсов сделанным каждым уникальным поставщиком услуг авиакомпании в наборе данных.

Создайте datastore с помощью набора данных airlinesmall.csv. Этот набор данных на 12 мегабайтов содержит 29 столбцов информации о рейсе для нескольких поставщиков услуг авиакомпании, включая прибытие и время отправления. В этом примере выберите UniqueCarrier (имя авиакомпании) как переменная интереса. Задайте пару "имя-значение" 'TreatAsMissing' так, чтобы datastore обработал значения 'NA' как пропавших без вести и заменил их на значения NaN.

ds = tabularTextDatastore('airlinesmall.csv', 'TreatAsMissing', 'NA');
ds.SelectedVariableNames = 'UniqueCarrier';
ds.SelectedFormats = '%C';

Предварительно просматривание данных.

preview(ds)
ans=8×1 table
    UniqueCarrier
    _____________

         PS      
         PS      
         PS      
         PS      
         PS      
         PS      
         PS      
         PS      

Запустите mapreduce на данных. Map и reduce функции считают количество экземпляров каждого имени поставщика услуг авиакомпании в каждом фрагменте данных, затем комбинируют те промежуточные количества в итоговое количество. Этот метод усиливает промежуточную сортировку по уникальному ключу, выполняемому mapreduce. Функции countMapper и countReducer включены в конце этого скрипта.

outds = mapreduce(ds, @countMapper, @countReducer);
********************************
*      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  10%
Map 100% Reduce  21%
Map 100% Reduce  31%
Map 100% Reduce  41%
Map 100% Reduce  52%
Map 100% Reduce  62%
Map 100% Reduce  72%
Map 100% Reduce  83%
Map 100% Reduce  93%
Map 100% Reduce 100%
readall(outds)
ans=29×2 table
      Key        Value 
    ________    _______

    'AA'        [14930]
    'AS'        [ 2910]
    'CO'        [ 8138]
    'DL'        [16578]
    'EA'        [  920]
    'HP'        [ 3660]
    'ML (1)'    [   69]
    'NW'        [10349]
    'PA (1)'    [  318]
    'PI'        [  871]
    'PS'        [   83]
    'TW'        [ 3805]
    'UA'        [13286]
    'US'        [13997]
    'WN'        [15931]
    'AQ'        [  154]
      ⋮

countMapper функции карты усиливает то, что данные являются категориальными. countcats и функции categories используются на каждом фрагменте входных данных, чтобы сгенерировать пары ключ/значение имени авиакомпании и сопоставленного количества.

function countMapper(data, info, intermKV)
% Counts unique airline carrier names in each chunk.
a = data.UniqueCarrier;
c = num2cell(countcats(a));
keys = categories(a);
addmulti(intermKV, keys, c)
end

Уменьшать функциональные чтения countReducer в промежуточных данных, произведенных картой, функционируют, и добавляет вместе все количества, чтобы произвести один итоговый счет для каждого поставщика услуг авиакомпании.

function countReducer(key, intermValIter, outKV)
% Combines counts from all chunks to produce final counts.
count = 0;
while hasnext(intermValIter)
    data = getnext(intermValIter);
    count = count + data;
end
add(outKV, key, count)
end

Входные параметры

свернуть все

Введите datastore, заданный как объект datastore. Используйте функцию datastore, чтобы создать объект datastore из вашего набора данных.

mapreduce работает только с хранилищами данных, которые детерминированы. Таким образом, если вы используете read на datastore, сбрасываете datastore с reset, и затем читаете datastore снова, затем возвращенные данные должны быть тем же самым в обоих случаях. вычисления mapreduce, включающие datastore, который не детерминирован, могут привести к непредсказуемым результатам. Смотрите Выбирают Datastore for File Format или Application для получения дополнительной информации.

Указатель на функцию, чтобы сопоставить функцию. mapfun получает фрагменты от входного datastore ds, и затем использует add и функции addmulti, чтобы добавить пары "ключ-значение" в промежуточный объект KeyValueStore. Количество вызовов функции карты mapreduce равно количеству фрагментов в datastore (количество фрагментов определяется свойством ReadSize datastore).

Входными параметрами к функции карты является data, info и intermKVStore, который mapreduce автоматически создает и передает функции карты:

  • data и входные параметры info являются результатом вызова функции read datastore, который mapreduce выполняет автоматически перед каждым вызовом функции карты.

  • intermKVStore является именем промежуточного объекта KeyValueStore, в который функция карты должна добавить пары "ключ-значение". Если ни один из вызовов функции карты не добавляет пары "ключ-значение" в intermKVStore, то mapreduce не вызывает уменьшать функцию, и выходной datastore пуст.

Пример шаблона для функции карты

function myMapper(data, info, intermKVStore)
%do a calculation with the data chunk
add(intermKVStore, key, value)
end

Пример: @myMapper

Типы данных: function_handle

Указатель на функцию, чтобы уменьшать функцию. mapreduce вызывает reducefun однажды для каждого уникального ключа, добавленного к промежуточному KeyValueStore функцией карты. В каждом вызове mapreduce передает значения, сопоставленные с активным ключом к reducefun как объект ValueIterator. Циклы функции reducefun через значения для каждого ключа с помощью hasnext и функций getnext. Затем после выполнения некоторого вычисления (вычислений) это пишет пары "ключ-значение" в окончательный результат.

Входными параметрами к уменьшать функции является intermKey, intermValIter и outKVStore, который mapreduce автоматически создает и передает уменьшать функции:

  • intermKey является активным ключом от промежуточного объекта KeyValueStore. Каждый вызов уменьшать функции mapreduce задает новый уникальный ключ от ключей в промежуточном объекте KeyValueStore.

  • intermValIter является ValueIterator, сопоставленный с активным ключом, intermKey. Этот объект ValueIterator содержит все значения, сопоставленные с активным ключом. Просмотрите значения путем прокрутки с помощью функций getnext и hasnext.

  • outKVStore является именем для итогового объекта KeyValueStore, в который уменьшать функция должна добавить пары "ключ-значение". mapreduce берет выходные пары "ключ-значение" из outKVStore и возвращает их в выходном datastore, outds, который является объектом KeyValueDatastore по умолчанию. Если ни один из вызовов уменьшать функции не добавляет итоговые пары "ключ-значение" в outKVStore, то выходной datastore пуст.

Пример шаблона для уменьшать функции

function myReducer(intermKey, intermValIter, outKVStore)
while hasnext(intermValIter)
    X = getnext(intermValIter);
    %do a calculation with the current value, X
end
add(outKVStore, key, value)
end

Пример: @myReducer

Типы данных: function_handle

Среда выполнения, заданная как объект MapReducer. mr является результатом вызова функции mapreducer. Аргумент mr по умолчанию является вызовом gcmr, который использует глобальную среду выполнения по умолчанию для mapreduce (в MATLAB, значением по умолчанию является mapreducer(0), который возвращает объект SerialMapReducer).

Примечание

Эта установка задает среду выполнения для mapreduce и не необходима, чтобы запустить mapreduce на вашем локальном компьютере. Для получения дополнительной информации смотрите, Убыстряются и Развертывают MapReduce Используя Другие продукты.

Аргументы в виде пар имя-значение

Укажите необязательные аргументы в виде пар ""имя, значение"", разделенных запятыми. Имя (Name) — это имя аргумента, а значение (Value) — соответствующее значение. Name должен появиться в кавычках. Вы можете задать несколько аргументов в виде пар имен и значений в любом порядке, например: Name1, Value1, ..., NameN, ValueN.

Пример: outds = mapreduce(ds, @mapfun, @reducefun, 'Display', 'off', 'OutputFolder', 'C:\Users\username\Desktop')

Тип datastore вывод, заданный как 'Binary' или 'TabularText'. Настройка по умолчанию 'Binary' возвращает KeyValueDatastore datastore вывода, который указывает на двоичный файл (.mat или .seq) файлы в выходной папке. Опция 'TabularText' возвращает tabularTextDatastore datastore вывода, который указывает на файлы .txt в выходной папке.

Таблица предоставляет подробную информацию для каждого из выходных типов.

'OutputType'Тип datastore выводитсяDatastore указывает на файлы типаЗначения, которые может добавить Уменьшать функцияКлючи, которые может добавить Уменьшать функцияДетали
'Binary' (значение по умолчанию)KeyValueDatastore.mat (или .seq при выполнении против Hadoop®).Любой допустимый объект MATLAB.Векторы символов, строки или числовые скаляры, которые не являются NaN, комплексным, логическим, или разреженным.Нет данных
'TabularText'TabularTextDatastore.txtВекторы символов, строки или числовые скаляры, которые не являются NaN, комплексным, логическим, или разреженным.Векторы символов, строки или числовые скаляры, которые не являются NaN, комплексным, логическим, или разреженным.
  • Файл является закодированным UTF-8.

  • Ключи и значения являются вкладкой разделенный (\t).

  • Разделителем строки является \r\n на Windows® и \n на Linux® и Mac.

Типы данных: char | string

Папка назначения для mapreduce вывод, заданный как путь к файлу. Выходная папка по умолчанию является текущей папкой, pwd. Можно задать различный путь с полностью определенным путем или с путем относительно текущей папки.

Пример: mapreduce(..., 'OutputFolder', 'MyOutputFolder\Results') задает путь к файлу относительно текущей папки для вывода.

Типы данных: char | string

Переключите для прогресса командной строки вывод, заданный как 'on' или 'off'. Значением по умолчанию является 'on', так, чтобы информация о прогрессе отображений mapreduce в командном окне во время карты и уменьшала фазы выполнения.

Типы данных: char | string

Выходные аргументы

свернуть все

Выведите datastore, возвращенный как объект KeyValueDatastore или TabularTextDatastore. По умолчанию outds является объектом KeyValueDatastore, который указывает на файлы .mat в текущей папке. Используйте аргументы пары Name,Value для 'OutputType' и 'OutputFolder', чтобы возвратить объект tabularTextDatastore или изменить местоположение выходных файлов, соответственно.

mapreduce не сортирует пары "ключ-значение" в outds. Их порядок может не согласиться при использовании других продуктов с mapreduce.

Чтобы просмотреть содержимое outds, используйте preview, read или функции readall datastore.

Советы

  • Отладка ваших алгоритмов mapreduce, чтобы исследовать, как пары "ключ-значение" перемещаются через различные фазы, всегда полезна. Чтобы исследовать перемещение данных, установите точки останова в своих map и reduce функциях. Точки останова останавливают выполнение mapreduce, позволяя вам исследовать текущий статус следующих переменных, как KeyValueStore или ValueIterator. Для получения дополнительной информации см. Алгоритмы MapReduce Отладки.

  • Некоторые рекомендации оптимизировать производительность mapreduce на любой платформе:

    • Минимизируйте количество вызовов функции карты. Самый легкий подход должен увеличить значение свойства ReadSize входного datastore. Результат состоит в том, что mapreduce передает большие фрагменты данных к функции карты, и datastore истощает с меньшим количеством чтений.

    • Уменьшите сумму промежуточных данных, отправленных между map и reduce функциями. Один подход должен использовать unique в функции карты, чтобы объединить подобные ключи. Смотрите Вычисляют, Подразумевают под Группой Используя MapReduce для примера этого метода.

Введенный в R2014b