前言
我们在编写MapReduce时,有时候需要打印一些日志信息,方便排查错误。例如,在Map任务中,发现某些数据格式错误,不仅仅是跳过这些错误的数据,还需要将错误数据打印到日志中。
YARN有一个日志聚合服务,可以去取到已完成的应用的任务日志,并且将其搬移到HDFS中,在那里任务日志被存储在一个容器文件中用于存档。我们在环境搭建的章节,已经开启了日志聚合服务。
使用日志
提交到YARN的任务,在执行时会产生一个日志文件(称作syslog),一个保存发送到标准输出数据的文件(称作stdout),一个保存标准错误的文件(称作stderr)。下面通过程序演示。
WordCountMapper代码。
1 | public class WordCountMapper extends Mapper<LongWritable, Text, Text, VIntWritable> { |
WordCountReducer代码。
1 | public class WordCountReducer extends Reducer<Text, VIntWritable, Text, VIntWritable> { |
WordCountRunner代码。
1 | public class WordCountRunner extends Configured implements Tool { |
查看日志
打开YARN的ResourceManager管理页面(8088端口),找到FINISHED
状态的任务。
将最下方的滚动条拖动到最右方,找到Tracking UI
项,点击History
链接。
在最下方的Successful
中,显示了成功完成的Map任务数量和Reduce任务数量。可以分别查看对应的Map日志和Reduce日志。
这里以Map任务为例,点击3
,如图所示。
点击logs
,进入日志查看页面。
页面中显示了stderr
、stdout
的日志信息,syslog
日志由于内容比较多,可以点击超链接查看详情。
注意,默认的日志级别是INFO
,因此DEBUG级别的消息不在syslog任务日志文件中出现。然而,有时候又希望看到这些消息。这时可以适当设置mapreduce.map.log.level
或者mapreduce.reduce.log.level
。例如,我们想将Map任务的日志级别设置为DEBUG,在提交任务时增加-D mapreduce.map.log.level=DEBUG
参数即可。
小结
本章介绍了MapReduce中如何打印日志。可以使用将日志信息打印到stderr
、stdout
以及syslog
三个日志文件中,分别使用System.err.println()
、System.out.println()
和日志组件的相关方法即可。