Конечно, вы можете определить несколько редукторов. Для работы (Hadoop 0.20) просто добавьте:
job.setNumReduceTasks(<number>);
Но. Ваша инфраструктура должна поддерживать несколько редукторов, а это значит, что вам нужно
- имеется более одного процессора
- соответственно откорректировать mapred.tasktracker.reduce.tasks.maximum в mapred-site.xml
И, конечно, ваша работа должна соответствовать некоторым спецификациям. Не зная, что именно вы хотите сделать, я могу дать только общие советы:
- ключ map-output должен быть либо разделен% numreducers, либо вы должны определить свой собственный разделитель:
job.setPartitionerClass(...)
например со случайным разделителем ...
- данные должны быть сокращены в многораздельном формате ... (необходимы ссылки?)
Вы получите несколько выходных файлов, по одному для каждого редуктора. Если вы хотите отсортированный вывод, вам нужно добавить еще одно задание, читающее все файлы (на этот раз несколько задач с картами ...) и записывающее их, отсортированные только с одним редуктором ...
Посмотрите также на класс Combiner, который является локальным Редуктором. Это означает, что вы можете агрегировать (уменьшать) уже в памяти более частичные данные, испускаемые картой.
Очень хороший пример - WordCount-Example. Карта выдает каждое слово в качестве ключа и его счет как 1: (слово, 1). Combiner получает частичные данные с карты, генерирует (,) локально. Редуктор делает то же самое, но теперь некоторые (комбинированные) счетчики слов уже> 1. Сохраняет полосу пропускания.