Hadoop MapReduce: Уточнение количества редукторов

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

Итак, вы думаете, что указание количества редукторов в Hadoop MapReduce не имеет никакого смысла, потому что оно зависит от программы. Однако Hadoop позволяет указать количество используемых редукторов (-D mapred.reduce.tasks = # редукторов).

Что это значит? Является ли значение параметра для числа редукторов, определяющее, сколько машинных ресурсов переходит на редукторы вместо количества используемых фактических редукторов?

Ответ 1

один редуктор используется для каждой клавиши, сгенерированной преобразователем

Этот комментарий неверен. Один вызов метода reduce() выполняется для каждого ключа, сгруппированного компаратором группировки. Редуктор (задача) - это процесс, который обрабатывает ноль или более вызовов для сокращения(). Свойство, к которому вы ссылаетесь, говорит о количестве задач редуктора.

Ответ 2

Чтобы упростить @Judge Mental (очень точно), ответьте немного: задача редуктора может работать по многим клавишам одновременно, но параметр mapred.reduce.tasks = # объявляет, сколько одновременных задач редуктора будет выполняться для определенного работа.

Пример, если ваш mapred.reduce.tasks = 10:
У вас есть 2000 ключей, каждая клавиша с 50 значениями (для равномерно распределенных пар 10 000 к: v). Каждый редуктор должен грубо обращаться с 200 ключами (1 000 k: v пар).

Пример, если ваш mapred.reduce.tasks = 20:
У вас есть 2000 ключей, каждая клавиша с 50 значениями (для равномерно распределенных пар 10 000 к: v). Каждый редуктор должен грубо обращаться с 100 ключами (пары 500 k: v).

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