Hadoop MapReduce java类中的最佳日志记录方法是什么?

时间:2015-04-16 15:43:47

标签: hadoop logging mapreduce log4j udf

我编写了在hadoop(2.1或2.2)上运行的类作为hive UDF / UDTF查询的一部分。最终它作为Map / Reduce工作运行。 应用程序执行各种任务,我想根据日志级别添加日志记录。

我想知道这样做的最佳方式(或正确方法)。 显然,我不希望日志驻留在未收集的数据节点上的某个文件中。我希望hadoop收集日志,以便我们能够从作业跟踪器等中心位置查看所有日志。

选项-1:直接日志记录解决方案 - 打印到system.out / system.err 我看到很多论坛提到打印到系统或系统错误,但它将意味着开发我们自己的具有调试级别等的日志记录机制......

System.out.println("my log message");

选项-2:使用hadoop的log4j commons日志记录 其他帖子提到使用apache commons logging。

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: log4j 2 一些架构师提到我们应该考虑添加log4j 2依赖项,并使用它。这个领域有什么建议吗?如果hadoop正在使用log4j,我可以自带log4j 2并使用它来写入hadoops日志吗?

在我继续之前,我想看看是否有人有好的建议。

感谢。

2 个答案:

答案 0 :(得分:1)

我更喜欢Logger log = Logger.getLogger(MyClass.class.getName()); ,它会收集作业跟踪器中的日志。

对于调试java map reduce文件,您可以为每个类(驱动程序,映射器,reducer)使用记录器。

log.info( "varOne: " + varOne );

要检查变量,只需使用:

<Credits>
    <Director>Movie</Director>
    <Director>Movie</Director>
    <Director>Movie</Director>
    <Producer></Producer>
    <Producer></Producer>
    <Actor>Jules Verne</Actor>
    <Producer></Producer>
    <Actor>Jules Verne</Actor>
    <Actor>Jules Verne</Actor>
</Credits>

这些日志行可以打印在您工作的管理页面中。

答案 1 :(得分:1)

我曾经使用过slf4j,它是log4j和其他日志库的包装器,如果你需要更改到其他一些日志库,你可以在不改变实际代码的情况下使用。

import org.slf4j.LoggerFactory;
private static final org.slf4j.Logger LOG = LoggerFactory.getLogger(WordCountExampleLoggingTest.class);

//将其用作

        LOG.error("Inseide Mapper");
        LOG.info("inside reducer ");

//对于日志记录配置,请在应用程序的resources文件夹中添加log4j.properies文件。

ODS.LOG.DIR=/var/log/appLogs
ODS.LOG.INFO.FILE=application.log
ODS.LOG.ERROR.FILE=application_error.log
# Root logger option
log4j.rootLogger=ERROR, console
log4j.logger.com.ournamespace=ERROR, APP_APPENDER, ERROR_APPENDER

#
# console
# Add "console" to rootlogger above if you want to use this
#

log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.target=System.out
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss}-%r %p %c{5}: %m%n

# Direct log messages to a log file
log4j.appender.APP_APPENDER=org.apache.log4j.RollingFileAppender
log4j.appender.APP_APPENDER.File=${ODS.LOG.DIR}/${ODS.LOG.INFO.FILE}
log4j.appender.APP_APPENDER.MaxFileSize=200MB
log4j.appender.APP_APPENDER.MaxBackupIndex=30
log4j.appender.APP_APPENDER.layout=org.apache.log4j.PatternLayout
log4j.appender.APP_APPENDER.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss}-%r %p %c{10}: %m%n


log4j.appender.ERROR_APPENDER=org.apache.log4j.RollingFileAppender
log4j.appender.ERROR_APPENDER.Threshold=ERROR
log4j.appender.ERROR_APPENDER.File=${ODS.LOG.DIR}/${ODS.LOG.ERROR.FILE}
log4j.appender.ERROR_APPENDER.MaxFileSize=200MB
log4j.appender.ERROR_APPENDER.MaxBackupIndex=90
log4j.appender.ERROR_APPENDER.layout=org.apache.log4j.PatternLayout
log4j.appender.ERROR_APPENDER.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss}-%r %p %c{10}: %m%n

我可以查看来自ambari job tracker UI的日志。 我希望能帮到你。