我不清楚应该如何在作业级别配置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
答案 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)
没有直接的方法来覆盖每个作业级别的log4j属性。
Map Reduce作业本身不会将日志存储在Hadoop中,而是将日志写入数据节点的本地文件系统(${hadoop.log.dir}/userlogs
)。 Yarn有一个单独的进程叫做log-aggregation,它收集那些日志和组合。
使用yarn logs --applicationId <appId>
获取完整日志,然后使用unix命令解析并提取所需的日志部分。