Не думайте, что в Hadoop один и тот же ключ может быть сопоставлен с несколькими редукторами. Но ключи могут быть разделены так, чтобы редукторы были более или менее равномерно загружены. Для этого входные данные должны быть сэмплированы, а ключи должны быть соответствующим образом разделены. Проверьте Yahoo Paper для более подробной информации о пользовательском разделителе. Код сортировки Yahoo находится в пакете org.apache.hadoop.examples.terasort .
Допустим, клавиша A имеет 10 строк, B имеет 20 строк, C имеет 30 строк и D имеет 60 строк на входе. Затем ключи A, B, C могут быть отправлены в редуктор 1, а ключ D может быть отправлен в редуктор 2, чтобы равномерно распределить нагрузку на редукторы. Для разделения ключей необходимо выполнить выборку входных данных, чтобы узнать, как распределены ключи.
Вот еще несколько предложений по ускорению выполнения задания.
Укажите Combiner на JobConf , чтобы уменьшить количество ключей, отправляемых редуктору. Это также уменьшает сетевой трафик между задачами маппера и редуктора. Хотя нет никакой гарантии, что объединитель будет вызван средой Hadoop.
Кроме того, поскольку данные перекошены (некоторые ключи повторяются снова и снова, скажем, «инструменты»), вы можете увеличить # количество задач сокращения , чтобы завершить задание быстрее. Это гарантирует, что в то время как редуктор обрабатывает «инструменты», другие данные обрабатываются другими редукторами параллельно.