将消息记录到userlogs/job目录中的自定义文件?

a9wyjsp7  于 2021-06-03  发布在  Hadoop
关注(0)|答案(2)|浏览(287)

我不清楚如何在作业级别配置hadoopmapreducelog4j。有人能帮我回答这些问题吗。
1) 如何从客户机添加对log4j日志记录的支持。i、 我想在客户机上使用log4j属性文件,因此不想干扰集群中的hadoop log4j设置。我认为在project/jar中有属性文件就足够了,而hadoop的分布式缓存应该可以完成其余的工作。
2) 如何将消息记录到$hadoop\u home/logs/userlogs/job\u/dir中的自定义文件。
3) map reduce任务会同时使用log4j属性文件吗?客户端作业提供的一个和hadoop集群中的一个?如果是,那么log4j.rootlogger将添加这两个属性值?
谢谢srivatsan nallazhagappan

prdp8dxp

prdp8dxp1#

您可以直接在代码中配置log4j。例如你可以打电话 PropertyConfigurator.configure(properties); e、 g.在mapper/reducer设置方法中。
这是存储在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()));
                }
            }
y0u0uwnf

y0u0uwnf2#

在每个作业级别上没有直接的方法重写log4j属性。
MapReduce作业本身不在hadoop中存储日志,而是在本地文件系统中写入日志( ${hadoop.log.dir}/userlogs )数据节点的。有一个单独的过程从Yarn所谓的日志聚合,收集这些日志和组合。
使用 yarn logs --applicationId <appId> 要获取完整日志,请使用unix命令解析和提取所需的日志部分。

相关问题