Что такое MapReduce

Модель программирования, используемая для эффективной параллельной обработки больших наборов данных распределенным образом.

Данные сначала разделяются, обрабатываются и объединяются для получения окончательного результата.

Задача уменьшения карты в основном делится на две фазы:

  1. Фаза сопоставления: здесь мы разделяем входные данные на фрагменты и обрабатываем эти фрагменты параллельно.
  2. Фаза уменьшения: выходные данные вышеуказанных фрагментов передаются в качестве входных данных для редуктора. Затем сокращает дальнейшие процессы или объединяет эти данные для получения окончательного результата.

Предположим, у нас есть массив целых чисел, содержащий 1k элементов, и мы должны суммировать все элементы и получить окончательную сумму. Мы можем решить эту проблему, используя 2 подхода (я расскажу о 2 подходах 😅, их может быть много)

  1. Традиционный подход

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

2. Использование MapReduce

Здесь мы разделим массив из 1k элементов на 10 небольших фрагментов данных (каждый фрагмент будет иметь 100 элементов), и каждый фрагмент будет обрабатываться отдельным потоком одновременно. У нас будет 10 потоков, и каждый поток будет перебирать 100 элементов, чтобы получить сумму этих 100 элементов. Теперь фаза редуктора, на которой выходные данные этих 10 потоков будут собираться и снова суммироваться для получения окончательного вывода.

Давайте посмотрим на приведенную выше реализацию с использованием кода jave

В приведенной выше программе мы использовали ExecutorService для фиксированных пулов потоков, и у нас будет 10 потоков в пуле.

Со строки 43 по 45 мы создаем 10 задач, где каждая задача будет выполняться отдельным потоком одновременно и будет производить сумму 100 элементов.

В строке 35 мы использовали ExecutorCompletionService, который добавит все результаты задач в очередь после завершения.

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

Функция reduceTask возьмет выходные данные функции mapTask и объединит их для получения окончательного результата.

Спасибо за прочтение ❤️