Термины map и reduce, которые составляют термин MapReduce, заимствованы из функциональных языков, таких как Lisp.
Например, вы хотите вычислить сумму квадратов.
Функция map – функция, которая может быть применена к любому из этих целых чисел и вычисляет квадрат каждого числа.
Так что map здесь является мета функцией, которая обрабатывает каждую запись.
Это первая часть.
Вторая часть – это функция reduce, которая получает на вход список соответствующих квадратов целых чисел и просто суммирует их.
reduce здесь снова является мета функцией, которая применяется к группе записей.
Предположим, что у нас есть текст, и нам нужно произвести подсчет для каждого слова, которое появляется в этом наборе данных.
Как сделать это? Особенно, когда вы имеете дело с большими объемами данных?
Здесь и появляется парадигма MapReduce.
Таким образом, map как задача или как объект обрабатывает отдельные записи для генерации промежуточных ключей / значений.
Если это простой файл, можно пройти через эти записи последовательно.
Но вы можете сделать этот процесс параллельным, особенно когда у вас большой набор данных.
Вы можете параллельно обрабатывать отдельные записи для генерации промежуточных пар ключ / значение.
Если y вас очень большой набор данных, вы можете разделить свой входной набор данных.
И назначить задачу map для каждого куска данных.
И соответствующий результат будет таким же, как если бы у вас была только одна задача map.
И это поможет существенно ускорить процесс.
После результата map, у нас есть ввод для reduce.
Reduce производит слияние промежуточных результатов в один результат, исходя из ключей значений.
Как распараллелить эту фазу reduce?
Фаза reduce не обрабатывает эти записи независимо, другими словами, одна запись и другая запись должны обрабатываться вместе, так как они имеют одинаковые ключи.
Таким образом, единственный способ распараллелить этот процесс, это разделить задачи reduce по ключам.
Существуют разные способы разбиения ключей на задачи.
Один из способов разделения – это использование хэшей.
Вы берете ключ, и обрабатываете его хеш-функцией.
Затем делите хэш на количество задач reduce и в остатке от деления получаете к какой reduce задаче данный ключ относится.
Например, если есть 10 задач reduce, эта операция вернет значения от 0 до 9 для всех ключей.
У парадигмы MapReduce есть реализация с открытым исходным кодом Apache Hadoop, это набор утилит, библиотек и фреймворк для разработки и выполнения распределённых программ, работающих на кластерах из сотен и тысяч узлов.
Итак,