Куда инфраструктура hadoop mapreduce отправляет мои операторы System.out.print()? (Стандартный вывод)

Я хочу отладить скрипт mapreduce и, не вдаваясь в особые проблемы, попытался вставить некоторые операторы print в мою программу. Но я не могу найти их ни в одном журнале.

5 ответов

Решение

На самом деле стандартный вывод показывает только System.out.println() не-карты сокращают классы.

System.out.println() Для карты и сокращения фаз можно увидеть в журналах. Простой способ получить доступ к журналам

http://localhost:50030/jobtracker.jsp-> нажмите на выполненную работу-> нажмите на карту или уменьшите задачу-> нажмите на номер задачи-> журналы задач-> журналы стандартного вывода.

Надеюсь это поможет

Другой способ через терминал:

1) Перейдите в каталог Hadoop_Installtion, затем в "logs / userlogs".
2) Откройте каталог job_id.
3) Проверьте каталоги с помощью _ m_, если вы хотите вывод картографа или _r_ если вы ищете редукторы.

Пример: в Hadoop-20.2.0:

> ls ~ / hadoop-0.20.2 / logs / userlogs / попытки_201209031127_0002_m_000000_0/
log.index   stderr      stdout      syslog

Вышеуказанное означает:
Hadoop_Installation: ~ / hadoop-0.20.2
job_id: job_201209031127_0002
_m_: задача карты, "номер карты": _000000_

4) открыть stdout, если вы использовали "system.out.println" или stderr, если вы использовали "system.err.append".

PS. другие версии hadoop могут иметь другую иерархию, но все они должны быть в каталоге $Hadoop_Installtion/logs/userlogs.

На кластере Hadoop с yarn, вы можете получить логи, включая stdout, с помощью:

yarn logs -applicationId application_1383601692319_0008

По какой-то причине я обнаружил, что это более полно, чем то, что я вижу в веб-интерфейсе. Веб-интерфейс не перечислил вывод System.out.println() для меня.

Чтобы получить свой стандартный вывод и записать сообщение на консоль, вы можете использовать Apache Commons Logging Framework в ваш маппер и редуктор.

public class MyMapper extends Mapper<..,...,..,...> {

    public static final Log log = LogFactory.getLog(MyMapper.class)

    public void map() throws Exception{
        // Log to stdout file
        System.out.println("Map key "+ key);

        //log to the syslog file
        log.info("Map key "+ key);

        if(log.isDebugEanbled()){
            log.debug("Map key "+ key);
        }

        context.write(key,value);
    }
}

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

      static private PrintStream console_log;
  static private boolean node_was_initialized = false;
  private static void logPrint(String line){
    if(!node_was_initialized){
      try{
        console_log = new PrintStream(new FileOutputStream("/tmp/my_mapred_log.txt", true));
      } catch (FileNotFoundException e){
        return;
      }
      node_was_initialized = true;
    }
    console_log.println(line);
  }

Что, например, можно использовать как:

      public void map(Text key, Text value, OutputCollector<Text, Text> output, Reporter reporter) throws IOException {
      logPrint("map input: key-" + key.toString() + ", value-" + value.toString());
      //actual impl of 'map'...
    }

После этого распечатки можно просмотреть с помощью: cat /tmp/my_mapred_log.txt. Чтобы избавиться от отпечатков от предыдущих запусков hadoop, вы можете просто использовать rm /tmp/my_mapred_log.txt перед повторным запуском hadoop.

Примечания:

  • Решение Раджкумара Сингха, вероятно, будет лучше, если у вас будет время загрузить и интегрировать новую библиотеку.
  • Это может работать для многоузловых кластеров, если у вас есть способ получить доступ к файлу "/tmp/my_mapred_log.txt" на каждом компьютере рабочего узла.
  • Если по какой-то странной причине у вас уже есть файл с именем "/tmp/my_mapred_log.txt", подумайте об изменении имени (просто убедитесь, что указан абсолютный путь).
Другие вопросы по тегам