Почему все задачи сокращения оказываются в одной машине? - PullRequest
0 голосов
/ 01 сентября 2011

Я написал относительно простую программу сокращения карт на платформе Hadoop (распространение cloudera).Каждое Map & Reduce записывает некоторую диагностическую информацию в стандартный вывод, помимо обычных задач map-Reduce.

Однако, просматривая эти файлы журналов, я обнаружил, что задачи Map относительно равномерно распределены между узлами (у меня 8 узлов).Но стандартный выходной журнал задачи сокращения можно найти только на одном компьютере.

Полагаю, это означает, что все задачи сокращения были выполнены на одном компьютере, и это проблематично и запутанно.

Кто-нибудь знает, что здесь происходит?Это проблема конфигурации?Как я могу сделать так, чтобы рабочие места сокращения также распределялись равномерно?

Ответы [ 2 ]

6 голосов
/ 01 сентября 2011

Если выходные данные всех ваших преобразователей имеют один и тот же ключ, они будут помещены в один редуктор.

Если в вашем задании есть несколько редукторов, но все они стоят в очереди на одной машине, то у вас естьпроблема конфигурации.

Используйте веб-интерфейс (http://MACHINE_NAME:50030) для отслеживания задания и просмотра его редукторов, а также того, какие машины на них работают.Есть и другая информация, которая может быть использована для получения информации, которая может помочь выяснить проблему.

Пара вопросов о вашей конфигурации:

  • Сколько редукторов работает длязадание?
  • Сколько редукторов доступно на каждом узле?
  • Является ли узел, на котором работает редуктор, лучшим оборудованием, чем другие узлы?
2 голосов
/ 01 сентября 2011

Hadoop решает, какой редуктор будет обрабатывать какие выходные ключи, используя Partitioner Если вы выводите только несколько ключей и хотите равномерное распределение между вашими редукторами, вам может быть лучше реализовать пользовательский Partitionerдля ваших выходных данных.например,

public class MyCustomPartitioner extends Partitioner<KEY, VALUE>
{
    public int getPartition(KEY key, VALUE value, int numPartitions) {
            // do something based on the key or value to determine which 
            // partition we want it to go to.
    }
}

Затем вы можете установить этот настраиваемый разделитель в конфигурации задания с помощью

Job job = new Job(conf, "My Job Name");
job.setPartitionerClass(MyCustomPartitioner.class);

Вы также можете реализовать настраиваемый интерфейс в вашем настраиваемом разделителе, если вы хотите выполнить дальнейшую настройку.на основе настроек работы.Кроме того, убедитесь, что вы не установили число задач уменьшения на 1 где-либо в конфигурации (ищите «mapred.reduce.tasks») или в коде, например,

job.setNumReduceTasks(1); 
...