登录MapReduce作业的标准做法

Fra*_*ank 5 java hadoop mapreduce mapr hadoop2

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

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

Ash*_*ith 8

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

import org.apache.log4j.Logger;
// other imports omitted

public class SampleMapper extends Mapper<LongWritable, Text, Text, Text> {
    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
    }
}        
Run Code Online (Sandbox Code Playgroud)

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

如果你正在使用纱线,则可以使用以下命令从命令行访问应用程序日志:

yarn logs -applicationId <application_id>
Run Code Online (Sandbox Code Playgroud)

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