UA-11904844-8

Принцип работы MapReduce

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

Далее программист предоставляет планировщику две программы: «map» и «reduce». При этом двухэтапном процессе программа «map» находит данные на диске и выполняет содержащиеся в ней инструкции. Это происходит на каждом из 20 серверов в нашем примере. Затем результаты выполнения программы «map» передаются процессу «reduce» для агрегации итоговых ответов. На рис. 4.6 этот процесс представлен наглядно.

Процесс mapreduce

Рис. 4.6. Процесс MapReduce

Рассмотрим пример, когда организация получает большой объем текстовых данных из онлайн-чатов отдела обслуживания клиентов на своем сайте. Аналитик создает map-шаг, чтобы разобрать каждое слово, присутствующее в тексте. В данном примере функция map будет просто находить каждое слово, отделять его от абзаца и присваивать ему номер 1. В результате получится набор пар значений, например «», «», «». После выполнения map-шага каждый рабочий узел сообщает об этом планировщику.

После окончания map-шага запускается reduce-шаг. На этом этапе нужно выяснить, сколько раз каждое слово встречается в тексте. То, что происходит далее, называется сортировкой, во время которой результаты map-шага распределяются с помощью хеширования так, чтобы одни и те же ключевые слова в итоге оказались в одних и тех же узлах. Например, в простом случае существовало бы 26 reduce-узлов, так что все слова, начинающиеся с буквы A, направлялись бы в один узел, слова на букву B — во второй, слова на букву C — в третий и т. д.

Разделяйте работу, часть 2!

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

На reduce-шаге происходит просто пересчет слов. В нашем примере результатом проведения reduce-шага будет: «», «», «», где числа соответствуют количеству найденных в тексте слов. Будет сгенерировано 26 файлов (по одному для каждого reduce-узла) с отсортированными числами. Следует отметить, что для создания 26 выходных файлов необходим еще один процесс. Чтобы получить итоговый набор ответов, часто требуется несколько процессов MapReduce.

Как только подсчитано количество слов, результаты можно использовать при проведении анализа, например определить частоту появления определенных названий товаров или таких слов, как «сломанный» или «сердитый». Дело в том, что поток текстовых данных, который был совершенно неструктурированным, теперь имеет простую структуру, позволяющую его проанализировать. Использование MapReduce часто служит отправной точкой, а результат применения данного алгоритма используется в качестве входных данных для другого аналитического процесса.

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

Предыдущий пункт нельзя игнорировать, поскольку он крайне важен для понимания того, когда и как стоит применять алгоритм MapReduce. Когда данные передаются рабочим узлам, каждый из них знает только о тех данных, которые он видит. Если процесс обработки требует того, чтобы рабочий узел знал о данных, находящихся на других узлах, то следует использовать не MapReduce, а другой фреймворк. К счастью, есть много случаев, когда данные могут быть обработаны таким способом. Разбор одного веб-журнала или одной RFID-записи на фрагменты ни от чего не зависит. Когда необходимо разобрать текст по идентификатору клиента, при распределении данных их просто нужно хешировать так, чтобы все записи, касающиеся данного клиента, оказались на одном и том же рабочем узле.

Концептуально алгоритм MapReduce разбивает проблему на части так же, как это делает параллельная реляционная база данных. Однако MapReduce — это не база данных, ибо у нее отсутствует определенная структура. Каждый отдельный процесс ничего не знает о том, что происходит до или после него. Существуют определенные сходства в том, что вы можете делать с помощью MapReduce и базы данных. База данных может обеспечить входные данные для процесса MapReduce, как и процесс MapReduce — для базы данных. Ключевой фактор — выбор наилучшего способа для решения конкретной задачи. Если что-то можно сделать с помощью данного набора инструментов, это не означает, что этот способ наилучший. Другие наборы инструментов могут быть гораздо более подходящими. Базы данных и модель MapReduce должны использоваться для решения тех задач, для которых они лучше всего подходят.