mapreduce

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

Описание

пример

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

outds = mapreduce(ds,mapfun,reducefun,mr) опционально задает настройки строения во время выполнения для mapreduce. The 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' значения как отсутствующие, и задайте 'MissingValue' Пара "имя-значение" для замены отсутствующих значений нулями.

ds = tabularTextDatastore('airlinesmall.csv','TreatAsMissing','NA',...
    'MissingValue',0);
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]}
      ⋮

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

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

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

function countReducer(key, intermValIter, outKV)
% Combines counts from all blocks 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 для формата файла или приложения.

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

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

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

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

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

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

Пример: @myMapper

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

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

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

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

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

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

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

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 - имя аргумента и Value - соответствующее значение. Name должны находиться внутри кавычек. Можно задать несколько аргументов в виде пар имен и значений в любом порядке Name1,Value1,...,NameN,ValueN.

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

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

В таблице приведены подробные данные для каждого из типов выходов.

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

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

  • Разделитель строк \r\n в Windows®, и \n в Linux® и Мак.

Типы данных: 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 алгоритмы, чтобы изучить, как пары "ключ-значение" перемещаются через различные фазы, всегда полезно. Чтобы изучить перемещение данных, установите точки останова на карте и уменьшите функции. Точки остановки выполнения mapreduce, что позволяет вам изучить текущее состояние релевантных переменных, таких как KeyValueStore или ValueIterator. Для получения дополнительной информации см. Раздел «Алгоритмы отладки Mapreduce».

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

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

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

Расширенные возможности

Введенный в R2014b