我编写了在hadoop(2.1或2.2)上运行的类,作为hiveudf/udtf查询的一部分。最终它作为map/reduce作业运行。应用程序执行各种任务,我想根据日志级别添加日志记录。
我想知道什么是最好的方式(或正确的方式)这样做。显然,我不希望日志驻留在数据节点上未被收集的某个文件中。我希望hadoop收集日志,以便我们能够从一个中心位置(如job tracker)查看所有日志。
选项1:直接的日志解决方案-打印到system.out/system.err我看到很多论坛提到打印到system out或system err,但这意味着开发我们自己的带有调试级别的日志机制。。。
System.out.println("my log message");
选项2:使用hadoop的log4jcommons日志其他帖子提到使用apachecommons日志。
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
private static final Log LOG = LogFactory.getLog(MgrsIndexCommon.class);
LOG.trace(“my logging message”);
我使用了它,它可以工作,但我没有权限修改记录器配置文件。我正在考虑在我的应用程序配置文件中添加一个具有日志级别的特性,并从java代码修改日志级别。顺便说一下,我没有在pom.xml中向log4j添加依赖项,而是使用了hadoop库附带的依赖项。
如果有人使用此选项,那么您是如何配置记录器的?
选项3:log4j2一些架构师提到,我们应该考虑添加log4j2依赖项,并使用它。这方面有什么建议吗?如果hadoop使用的是log4j,我能带上自己的log4j2并用它来写hadoop日志吗?
在我继续之前,我想看看是否有人有好的建议。
谢谢。
2条答案
按热度按时间ilmyapht1#
我更喜欢
java.util.logging.Logger
,它将收集作业跟踪器中的日志。为了调试java map reduce文件,可以对每个类(驱动程序、Map程序、还原程序)使用记录器。
要检查变量,只需使用:
可以在作业的“管理”页中打印这些日志行。
raogr8fs2#
我曾经使用过slf4j,它是log4j和其他日志库的 Package 器,如果您需要更改到其他日志库,您可以,而无需更改实际代码。
//把它当作
//对于日志配置,在应用程序的resources文件夹中添加log4j.properies文件。
我可以从ambari job tracker用户界面查看日志。我希望这能对你有所帮助。