Разница между объединителем и разделителем
Я новичок в MapReduce и просто не могу понять разницу в разделителях и объединителях. Я знаю, что оба выполняются на промежуточном этапе между картой и сокращают задачи, и оба уменьшают объем данных, которые должны обрабатываться задачей сокращения. Пожалуйста, объясните разницу на примере.
2 ответа
Во-первых, согласитесь с комментарием @Binary nerd
Combiner можно рассматривать как мини-редукторы в фазе карты. Они выполняют локальное сокращение результатов сопоставления, прежде чем распространять их дальше. После того, как функциональность Combiner выполнена, она передается редуктору для дальнейшей работы.
в то время как
Partitioner
попадаем в картину, когда мы работаем над несколькими редукторами. Итак, разделитель решает, какой редуктор отвечает за конкретный ключ. Они в основном принимаютMapper
Результат (еслиCombiner
используется тогдаCombiner
Результат) и отправьте его ответственному Редуктору на основании ключа
С сценариями Combiner и Partitioner:
С сценарием Partitioner only:
Примеры:
Пример разделителя:
Фаза разбиения происходит после фазы отображения и перед фазой сокращения. Количество перегородок равно количеству редукторов. Данные распределяются по редукторам в соответствии с функцией разделения. Разница между разделителем и объединителем состоит в том, что разделитель делит данные в соответствии с количеством преобразователей, так что все данные в одном разделе выполняются одним преобразователем. Однако объединитель функционирует аналогично преобразователю и обрабатывает данные в каждом разделе. Объединитель - это оптимизация редуктора. Функция разделения по умолчанию - это функция разделения хеш-функции, в которой хеширование выполняется для ключа. Однако может быть полезно разделить данные в соответствии с какой-либо другой функцией ключа или значения. - Источник
Я думаю, небольшой пример может объяснить это очень четко и быстро.
Допустим, у вас есть задание MapReduce Word Count с 2 сопоставителями и 1 редуктором.
Без Combiner.
"hello hello there"
=> mapper1 => (hello, 1), (hello,1), (there,1)
"howdy howdy again"
=> mapper2 => (howdy, 1), (howdy,1), (again,1)
Оба выхода попадают в редуктор => (again, 1), (hello, 2), (howdy, 2), (there, 1)
Использование редуктора в качестве Combiner
"hello hello there"
=> mapper1 с сумматором => (hello, 2), (there,1)
"howdy howdy again"
=> mapper2 с сумматором => (howdy, 2), (again,1)
Оба выхода попадают в редуктор => (again, 1), (hello, 2), (howdy, 2), (there, 1)
Заключение
Конечный результат тот же, но при использовании объединителя выходные данные карты уже уменьшаются. В этом примере вы отправляете только 2 выходные пары вместо 3 пар в редуктор. Таким образом, вы получаете производительность ввода-вывода / диска. Это полезно при агрегировании значений.
На самом деле Combiner - это Редуктор, применяемый к выводам map().
Если вы посмотрите на самый первый учебник по Apache MapReduce, который является именно тем примером mapreduce, который я только что проиллюстрировал, вы увидите, что они используют редуктор в качестве объединителя:
job.setCombinerClass(IntSumReducer.class);
job.setReducerClass(IntSumReducer.class);