Hadoop 2中的自定义log4j appender

时间:2014-04-07 17:04:38

标签: java hadoop log4j amazon-emr

如何在Hadoop 2(amazon emr)中指定自定义log4j appender?

Hadoop 2忽略我的包含自定义appender的log4j.properties文件,用内部lo​​g4j.properties文件覆盖它。标记-Dhadoop.root.logger表示specifies logging threshold,但它对自定义附加程序没有帮助。

3 个答案:

答案 0 :(得分:8)

我知道这个问题已经得到了解答,但有一种更好的方法可以做到这一点,并且这些信息在任何地方都不容易获得。实际上至少有两个log4j.properties在Hadoop中使用(至少对于YARN)。我正在使用Cloudera,但它与其他发行版类似。

本地属性文件

位置:/etc/hadoop/conf/log4j.properties(在客户端计算机上)

普通的java进程使用了​​log4j.properties。 它会影响在java进程中发生但不在YARN / Map Reduce内部的所有内容的日志记录。因此,所有驱动程序代码,插件映射减少作业的任何内容(例如,级联初始化消息)将根据您在此处指定的规则进行记录。这几乎不是您关心的日志属性文件。

正如您所期望的那样,在调用hadoop命令后会解析此文件,因此在更新配置时无需重新启动任何服务。

如果此文件存在,它将优先于jar中的文件(因为它通常在类路径中较早)。如果此文件不存在,将使用jar中的文件。

容器属性文件

位置:etc/hadoop/conf/container-log4j.properties(在数据节点机器上)

此文件决定所有map和reduce任务的输出属性,并且几乎总是在您讨论hadoop日志记录时要更改的内容。

在较新版本的Hadoop / YARN中,有人发现了一种危险的恶劣日志热,现在默认的日志记录配置可确保单个作业可以生成数百个不可读的垃圾,使您的日志难以阅读。我建议在container-log4j.properties文件的底部放置这样的东西,以摆脱大部分有关处理了多少字节的非常有用的消息:

log4j.logger.org.apache.hadoop.mapreduce=WARN
log4j.logger.org.apache.hadoop.mapred=WARN
log4j.logger.org.apache.hadoop.yarn=WARN
log4j.logger.org.apache.hadoop.hive=WARN
log4j.security.logger=WARN

默认情况下,此文件通常不存在,在这种情况下,将使用在hadoop-yar-server-nodemanager-stuff.jar中找到的此文件的副本(如uria​​h kremer所述)。但是,与其他log4j-properties文件一样,如果您创建/etc/hadoop/conf/container-log4j.properties,它将用于您所有的YARN内容。这很好!

注意:无论您做什么,jar 中的container-log4j-properties的副本都不会用于这些属性,因为YARN nodemanager jar是类路径中更高。同样,尽管互联网告诉你-Dlog4j.configuration=PATH_TO_FILE不会改变容器记录属性,因为在初始化容器时,该选项不会传递给yarn。

答案 1 :(得分:3)

1.为了更改名称节点的log4j.properties,你可以更改/home/hadoop/log4j.properties。

2.为了更改容器日志的log4j.properties,你需要在yarn容器jar中更改它,因为它们硬编码直接从项目资源加载文件。

2.1 ssh到slave(在EMR上你也可以简单地将它添加为bootstrap动作,所以你不需要ssh到每个节点)。 ssh to hadoop slave

2.2覆盖jar资源中的container-log4j.properties:

jar uf /home/hadoop/share/hadoop/yarn/hadoop-yarn-server-nodemanager-2.2.0.jar container-log4j.properties

答案 2 :(得分:1)

在部署中查找hadoop-config.sh。这是在执行hadoop命令之前获取的脚本。我在hadoop-config.sh中看到以下代码,看看修改是否有帮助。

HADOOP_OPTS="$HADOOP_OPTS -Dhadoop.root.logger=${HADOOP_ROOT_LOGGER:-INFO,console}"