Hadoop не может установить редукторы> 1

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

Я пытаюсь установить количество редукторов на 19 (что составляет 0,95 *, как и предполагается в документации). Однако, когда я просматриваю свою работу в трекере задач, он говорит, что всего 1 редуктор.

System.err.println("here");
job.setNumReduceTasks(19);
System.err.println(job.getNumReduceTasks());

Урожайность, как и ожидалось:

here
19

Но в конечном итоге я получаю:

12/05/16 11:10:54 INFO mapred.JobClient:     Data-local map tasks=111
12/05/16 11:10:54 INFO mapred.JobClient:     Rack-local map tasks=58
12/05/16 11:10:54 INFO mapred.JobClient:     Launched map tasks=169
12/05/16 11:10:54 INFO mapred.JobClient:     Launched reduce tasks=1

Части карты, которые я перезаписал:

  • картопостроитель
  • редуктор
  • Разметка
  • Группировка Компаратор.

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

Я также проверил, что групер работает правильно.

Я не уверен, что еще может быть причиной этого. Если кто-то может помочь, это будет высоко ценится.

Я очень анти-Java человек, поэтому, пожалуйста, попробуйте использовать очень явные примеры.

PS: я не настраивал этот кластер, он был установлен университетом, поэтому я не уверен ни в каких переменных конфигурации. PS: было слишком много кода для публикации, поэтому, пожалуйста, дайте мне знать любой код, в частности, вы хотели бы видеть.

Изменить: TejasP задала мне следующие вопросы:

Вы действительно запускаете код на Hadoop или в локальном режиме? (посмотрите, видны ли ваши вакансии на трекере и треккере).

Да, это можно просмотреть в пользовательском интерфейсе JobTracker. Об этом также сообщает 1 редуктор. А также с Примечание: это имеет редукторы, перечисленные как 1 в файле settings.xml

Вы экспортировали переменные HADOOP в среду?

Да, и они видны в env, и код не компилируется, пока я их не установлю.

env | grep HADOOP
HADOOP_HOME=/mnt/biginsights/opt/ibm/biginsights/IHC
HADOOP_CONF_DIR=/mnt/biginsights/opt/ibm/biginsights/hadoop-conf

Является ли кластер одним узлом или несколькими узлами? И даже если кластер состоит из нескольких узлов, все ли узлы исправны? Есть ли проблема с другими узлами?

Да, есть несколько узлов (10) Отчеты о работе трекера:

Nodes: 10
Map Task Capacity: 20
Reduce Task Capacity: 20
Blacklisted Nodes: 0

Правильно ли вы используете setNumReduceTasks? Как указано выше, я вызвал set, а затем получил и получил обратно значение, которое было задано как (19), но в конечном коде все еще использовался только 1.

Вы можете уменьшить свой код до небольшого кода уменьшения карты, удалив детали (это только для "отладки"). Запустить его. Посмотри что получится. Столкнувшись с той же проблемой, приведите сокращенный код в исходном вопросе.

Я постараюсь редактировать снова с результатами

2 ответа

Решение

Несколько моментов, которые нужно учитывать:

  1. Вы действительно запускаете код на Hadoop или в локальном режиме? (посмотрите, видны ли ваши вакансии на трекерах и трекерах)
  2. Вы экспортировали переменные HADOOP в среду?
  3. Является ли кластер одним узлом или несколькими узлами?
  4. Даже если кластер состоит из нескольких узлов, все ли узлы исправны? Есть ли проблема с другими узлами?
  5. Правильно ли вы используете setNumReduceTasks? Вы можете уменьшить свой код до небольшого кода уменьшения карты, удалив детали (это только для отладки). Запустить его. Посмотри что получится. Столкнувшись с той же проблемой, приведите сокращенный код в исходном вопросе.

Похоже, вы запускаете его в режиме LocalJobRunner (скорее всего из затмения). В этом режиме, если число задач уменьшения> 1, оно сбрасывает число до 1. Посмотрите на следующие несколько строк из LocalJobRunner.java

int numReduceTasks = job.getNumReduceTasks();
if (numReduceTasks > 1 || numReduceTasks < 0) {
      // we only allow 0 or 1 reducer in local mode
      numReduceTasks = 1;
      job.setNumReduceTasks(1);
}
Другие вопросы по тегам