如何在 Hadoop 2 (amazon emr) 中指定自定义 log4j appender?
Hadoop 2 忽略我的包含自定义附加程序的 log4j.properties 文件,用内部 log4j.properties 文件覆盖它。有一个标志 -Dhadoop.root.logger
那 specifies logging threshold ,但它对自定义 appender 没有帮助。
最佳答案
我知道这个问题已经得到解答,但是有更好的方法可以做到这一点,而且这些信息在任何地方都不容易获得。实际上至少有两个 log4j.properties 在 Hadoop 中使用(至少对于 YARN)。我使用的是 Cloudera,但其他发行版也类似。
本地属性文件
位置:/etc/hadoop/conf/log4j.properties
(在客户端机器上)
普通 java 进程使用的是 log4j.properties。 它会影响 java 进程中发生的所有事情的日志记录,但不会影响 YARN/Map Reduce 内部发生的所有事情。因此,您所有的驱动程序代码,任何将 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(如 uriah kremer 所述)中找到的此文件的副本。但是,与其他 log4j-properties 文件一样,如果您确实创建了 /etc/hadoop/conf/container-log4j.properties
,它将用于您所有的 YARN 内容。哪个好!
注意:无论您做什么,您的 jar 中的 container-log4j-properties 副本都不会用于这些属性,因为 YARN nodemanager jar 是在类路径中更高。同样,尽管互联网告诉您 -Dlog4j.configuration=PATH_TO_FILE
不会更改您的容器日志记录属性,因为该选项不会在容器初始化时传递给 yarn。
关于java - Hadoop 2 中的自定义 log4j appender,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22918720/