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

Sri*_*pan 8 hadoop log4j mapreduce 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

Luk*_*Luk 3

您可以直接在代码中配置 log4j。例如,您可以PropertyConfigurator.configure(properties);在映射器/减速器设置方法中调用例如。

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

        InputStream is = fs.open(log4jPropertiesPath);
        Properties properties = new Properties();
        properties.load(is);
        PropertyConfigurator.configure(properties);
Run Code Online (Sandbox Code Playgroud)

其中 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()));
                }
            }
Run Code Online (Sandbox Code Playgroud)