Hadoop MapReduce log4j - 将消息记录到userlogs / job_ dir中的自定义文件?

时间:2014-04-04 10:20:57

标签: hadoop mapreduce log4j distributed-cache

我不清楚应该如何在作业级别配置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

2 个答案:

答案 0 :(得分:3)

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

这是存储在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()));
                }
            }

答案 1 :(得分:1)

  1. 没有直接的方法来覆盖每个作业级别的log4j属性。

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

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