记录MapReduce作业的标准做法

我正在尝试找到登录MapReduce作业的最佳方法。 我在我的其他Java应用程序中使用slf4j和log4j appender,但由于MapReduce作业在集群中以分布式方式运行,我不知道应该在哪里设置日志文件位置,因为它是一个访问受限的共享集群特权。

是否有任何标准做法用于登录MapReduce作业,因此您可以在作业完成后轻松查看群集中的日志?

您可以使用log4j,它是hadoop使用的默认日志记录框架。 因此,从MapReduce应用程序中,您可以执行以下操作:

import org.apache.log4j.Logger; // other imports omitted public class SampleMapper extends Mapper { private Logger logger = Logger.getLogger(SampleMapper.class); @Override protected void setup(Context context) { logger.info("Initializing NoSQL Connection.") try { // logic for connecting to NoSQL - ommitted } catch (Exception ex) { logger.error(ex.getMessage()); } } @Override protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { // mapper code ommitted } } 

此示例代码将使用log4j logger将事件记录到inheritance的Mapper记录器。 所有日志事件都将记录到各自的任务日志中。 您可以从JobTracker(MRv1)/ ResourceManager(MRv2)网页访问任务日志。

如果您使用的是yarn ,则可以使用以下命令从命令行访问应用程序日志:

 yarn logs -applicationId  

如果您使用mapreduce v1 ,则命令行没有单点访问; 因此,您必须登录每个TaskTracker并查看配置的路径,一般在${hadoop.log.dir}/userlogs中指定的/var/log/hadoop/userlogs/attempt_/syslog包含log4j输出。

要添加到@Ashrith的答案:您可以通过JobTracker GUI查看各个任务跟踪器日志。 JT Gui可以看到正在运行的任务尝试,您可以单击以下任何一项:stderr,stdout和系统日志。 您可以在系统日志中找到log4j输出。