Hadoop MapReduce log4j - 将日志消息记录到用户日志/userlogs/job_目录中的自定义文件?

8

我不太清楚如何在作业级别上配置Hadoop MapReduce log4j。有人能帮我回答以下问题吗?

1)如何从客户机添加log4j日志记录支持。即,我想在客户机上使用log4j属性文件,因此不想干扰集群中的Hadoop log4j设置。我认为将属性文件放在项目/ jar中就足够了,然后hadoop的分布式缓存应该会传输map-reduce jar。

2)如何将消息记录到$HADOOP_HOME/logs/userlogs/job_/dir中的自定义文件中。

3)Map Reduce任务是否会同时使用两个log4j属性文件?客户端作业提供的文件和Hadoop集群中存在的文件?如果是,那么log4j.rootLogger会添加两个属性值吗?

谢谢 Srivatsan Nallazhagappan


我遇到了同样的问题,@Srivatsan Nallazhagappan 你是怎么解决这个问题的?请回复。 - Amit Kumar Kannaujiya
2个回答

3
您可以直接在您的代码中配置log4j。例如,您可以在mapper/reducer设置方法中调用PropertyConfigurator.configure(properties);
这是一个存储在hdfs上的属性示例:
        InputStream is = fs.open(log4jPropertiesPath);
        Properties properties = new Properties();
        properties.load(is);
        PropertyConfigurator.configure(properties);

其中fs是文件系统对象,log4jPropertiesPath是HDFS上的路径。

有了这个,您还可以将日志输出到带有作业ID的目录中。例如,在调用PropertyConfigurator.configure(properties)之前,您可以修改我们的属性。

Enumeration propertiesNames = properties.propertyNames();
            while (propertiesNames.hasMoreElements()) {
                String propertyKey = (String) propertiesNames.nextElement();
                String propertyValue = properties.getProperty(propertyKey);

                if (propertyValue.indexOf(JOB_ID_PATTERN) != -1) {
                    properties.setProperty(propertyKey, propertyValue.replace(JOB_ID_PATTERN, context.getJobID().toString()));
                }
            }

1
  1. 每个作业级别覆盖log4j属性的方法并不直接。

  2. Map Reduce作业本身不会将日志存储在Hadoop中,它会将日志写入数据节点的本地文件系统(${hadoop.log.dir}/userlogs)。有一个名为log-aggregation的来自Yarn的单独进程收集并组合这些日志。

使用yarn logs --applicationId <appId>获取完整日志,然后使用unix命令解析和提取所需的日志部分。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接