exponenta event banner

mapreduce

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

Описание

пример

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

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

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

Примеры

свернуть все

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

Создание хранилища данных с помощью airlinesmall.csv набор данных. Этот 12-мегабайтный набор данных содержит 29 столбцов полетной информации для нескольких авиаперевозчиков, включая время прилета и вылета. В этом примере выберите UniqueCarrier (название авиакомпании) в качестве интересующей переменной. Укажите 'TreatAsMissing' пара имя-значение, чтобы хранилище данных обрабатывало '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 по данным. Функции отображения и сокращения подсчитывают количество экземпляров названия каждого авиаперевозчика в каждом блоке данных, затем объединяют эти промежуточные счетчики в окончательный подсчет. Этот метод использует промежуточную сортировку по уникальному ключу, выполняемую 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 block.
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 blocks to produce final counts.
count = 0;
while hasnext(intermValIter)
    data = getnext(intermValIter);
    count = count + data;
end
add(outKV, key, count)
end

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

свернуть все

Входное хранилище данных, указанное как объект хранилища данных. Используйте datastore для создания объекта хранилища данных из набора данных.

mapreduce работает только с детерминированными хранилищами данных. То есть, если вы используете read в хранилище данных, сбросьте хранилище данных с помощью resetзатем снова считывайте хранилище данных, а затем возвращаемые данные должны быть одинаковыми в обоих случаях. mapreduce вычисления с использованием хранилища данных, которое не является детерминированным, могут привести к непредсказуемым результатам. Дополнительные сведения см. в разделе Выбор хранилища данных для формата файла или приложения.

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

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

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

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

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

function myMapper(data, info, intermKVStore)
%do a calculation with the data block
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 содержит все значения, связанные с активным ключом. Прокрутка значений с помощью hasnext и getnext функции.

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

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

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')

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

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

'OutputType'Тип выходных данных хранилища данныхХранилище данных указывает на файлы типаЗначения, которые может добавить функция сокращенияКлавиши, которые может добавить функция сокращенияПодробнее
'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

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

свернуть все

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

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

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

Совет

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

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

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

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

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

Представлен в R2014b