Куда инфраструктура 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", подумайте об изменении имени (просто убедитесь, что указан абсолютный путь).