8

我不清楚应该如何在作业级别配置 Hadoop MapReduce log4j。有人可以帮我回答这些问题。

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

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

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

谢谢 Srivatsan Nallazhagappan

4

2 回答 2

3

您可以直接在代码中配置 log4j。例如,您可以PropertyConfigurator.configure(properties);在 mapper/reducer 设置方法中调用 eg。

这是存储在 hdfs 上的属性的示例:

        InputStream is = fs.open(log4jPropertiesPath);
        Properties properties = new Properties();
        properties.load(is);
        PropertyConfigurator.configure(properties);

其中 fs 是 FileSystem 对象,log4jPropertiesPath 是 hdfs 上的路径。

有了这个,您还可以将日志输出到带有 job_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()));
                }
            }
于 2018-04-27T08:51:54.560 回答
1
  1. 没有直接的方法可以覆盖每个作业级别的 log4j 属性。

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

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

于 2018-05-04T05:22:13.177 回答