记录 MapReduce 作业的标准做法

Standard practices for logging in MapReduce jobs

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

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

您可以使用 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
    }
}        

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

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

yarn logs -applicationId <application_id>

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

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