Начало работы с MapReduce

Как номер и тип устройств сбора данных ежегодно растет, чистый размер и уровень собранных данных быстро расширяются. Эти большие наборы данных могут содержать гигабайты или терабайты данных, и могут вырасти на порядке мегабайтов или гигабайтов в день. В то время как набор этой информации представляет возможности для понимания, это также представляет собой много проблем. Большинство алгоритмов не разработано, чтобы обработать большие наборы данных за разумное количество времени или с разумным объемом памяти. MapReduce позволяет вам справляться со многими из этих проблем получить важную информацию от больших наборов данных.

Что такое 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

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

Алгоритм имеет следующие шаги:

  1. mapreduce читает фрагмент данных из входного datastore с помощью [data,info] = read(ds), и затем вызывает функцию карты, чтобы работать над тем фрагментом.

  2. Функция карты получает фрагмент данных, организует его или выполняет предшествующее вычисление, и затем использует add и функции addmulti, чтобы добавить, что пары "ключ-значение" к промежуточному объекту хранения данных вызвали KeyValueStore. Количество вызовов функции карты mapreduce равно количеству фрагментов во входном datastore.

  3. После того, как функция карты работает надо всеми фрагментами данных в datastore, группы mapreduce все значения в промежуточном объекте KeyValueStore уникальным ключом.

  4. Затем, mapreduce вызывает уменьшать функцию однажды для каждого уникального ключа, добавленного функцией карты. Каждый уникальный ключ может иметь много присваиваемых значений. mapreduce передает значения уменьшать функции как объект ValueIterator, который является объектом, используемым, чтобы выполнить итерации по значениям. Объект ValueIterator для каждого уникального ключа содержит все присваиваемые значения для того ключа.

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

    Примечание

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

Вычисление MapReduce в качестве примера

Этот пример использует простое вычисление (среднее значение путешествуют на расстояние в наборе полетных данных) проиллюстрировать, что шаги должны были запустить 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'
                             }
               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 автоматически вызывает map и reduce функции во время выполнения, таким образом, эти функции должны удовлетворить определенные требования, чтобы запуститься правильно.

  1. Входными параметрами к функции карты является 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.

  2. Входными параметрами к уменьшать функции является 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.

Для получения информации о записи более усовершенствованных map и reduce функций смотрите Запись Функция Карты и Запись Уменьшать Функция.

Выполнение mapreduce

После того, как у вас будут datastore, функция карты и уменьшать функция, можно вызвать mapreduce, чтобы выполнить вычисление. Чтобы вычислить среднее расстояние рейса в наборе данных, вызовите mapreduce с помощью ds, MeanDistMapFun.m и MeanDistReduceFun.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]

Смотрите также

|

Похожие темы