说明:本文提及的所有配置参数,都是基于Hadoop 2.5.0-cdh5.2.0环境。
MapReduce(MR)的调试是一个比较麻烦的问题,除了一些辅助调试工具(如mrunit)外,相信通过日志定位问题仍然是一个比较常见的方法。虽然这种方法比较原始,但是很多时候也能解决大问题......
下面将描述使用MR的日志时,需要注意的一些问题。
1. MR运行过程中,日志将暂存于yarn.nodemanager.log-dirs配置项指定的本地路径下,默认为/var/log/hadoop-yarn/container;
2. MR运行结束后(无论正常结束与否),将持久化日志到yarn.nodemanager.remote-app-log-dir和yarn.nodemanager.remote-app-log-dir-suffix配置项指定的HDFS路径下,前者默认为/tmp/logs,后者默认为logs。HDFS的实际路径为${yarn.nodemanager.remote-app-log-dir}/${user}/${yarn.nodemanager.remote-app-log-dir-suffix}/${application_id},例如:/tmp/logs/root/logs/application_1427333457223_0068;
3. 日志持久化后,会删除本地的暂存日志;
4. 在自定义的SortComparatorClass中定义的日志,将输出在map日志中;在自定义的GroupingComparatorClass中定义的日志,将输出在reduce日志中;在自定义WritableComparable中定义的日志,如果在map或者reduce中使用了该WritableComparable,将输出到对应的map或者reduce日志中;
5. 不建议在MR中,尤其是线上环境下,生成太多的MR日志。否则,将极大的增加磁盘I/O负载。还有,即使MR任务已经完成,但是YARN还未完成从本地到HDFS的日志收集。此时访问日志时,可能还会出现提示"Logs not available for attempt_1427333457223_0072_m_000015_0. Aggregation may not be complete, Check back later or try the nodemanager at sjxt-hd04:8041";
6. MR运行中,Map和shuffle的输出都将落在本地,路径由yarn.nodemanager.local-dirs配置项指定。这个虽然与日志无关,还是放在这里吧......