Размер шрифта
-
+

Введение в облачные и распределенные информационные системы - стр. 7

И главная функция здесь – это map.

Эта функция принимает значение, которое в этом случае является текстом.

Значением может быть одна строка текста во входном файле.

Эта строка разбивается на слова.

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

Таким образом это промежуточная выходная пара ключ-значение.

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



Эта функция reduce вызывается для каждого ключа, который относится к данной задаче reduce.

Таким образом, reduce будет проходить через все значения и суммировать их и вырабатывать пару «ключ-значение», где ключ совпадает с ключом ввода, а значение – фактически сумма входных значений.

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



Посмотрим пример приложения, который использует MapReduce.

Это распределенный grep.



Предположим, у вас есть большой набор файлов с большими текстами в них.

И у вас есть шаблон, который может быть регулярным выражением или просто словом, или набором слов, и вы хотите вывести все строки текста, соответствующие этому шаблону.

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

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

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

Преимущество распределенного grep здесь в скорости обработки.

С помощью MapReduce вы можете запускать ваше приложение, даже если ваши данные распределены на нескольких серверах.

Итак, как программировать с MapReduce?

С точки зрения пользователя, пользователь записывает программу map, ее метод map, а также записывает программу reduce, и ее метод reduce.



Затем запускает работу, определяя количество задач map и reduce, и затем ожидает результата.

По сути, работа пользователя очень простая, потому что пользователю не нужно много знать о Hadoop или распределенном программировании.

Это внутри, реализация парадигмы MapReduce, и собственно планировщик должен обеспечить распараллеливание map, он должен разделить данные между различными задачами map.

И он должен передать данные из map в reduce, при этом разделяя ключи по reduce задачам.

А также необходимо распараллелить reduce.

Другими словами, необходимо запланировать сами задачи reduce.

И, наконец, необходимо реализовать хранилище для ввода map, для вывода map, которое совпадает с вводом reduce, а также реализовать вывод reduce.

Кроме того, нужно обеспечить, чтобы фаза reduce стартовала только после окончания фазы map.

Итак, как решить все эти проблемы?

В облаке распараллелить map легко, потому что каждая задача map является независимой от другой задачи map, и поэтому эти задачи map могут быть определены для выполнения любому серверу.

Обычно задачи map назначаются серверу, к которому эти данные наиболее близко находятся, чтобы уменьшить сетевые издержки.

Далее необходимо гарантировать, чтобы все исходящие записи map с одним и тем же ключом были присвоены одному и тому же reduce.

Страница 7