1

我编写了在 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 logging 其他帖子提到使用 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 日志吗?

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

谢谢。

4

2 回答 2

1

我更喜欢java.util.logging.Logger,它会收集工作跟踪器中的日志。

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

Logger log = Logger.getLogger(MyClass.class.getName());

要检查变量,只需使用:

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

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

于 2015-05-24T23:11:30.443 回答
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 ");

// 对于 Logging 配置,在应用程序的资源文件夹中添加 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 的日志。我希望这可以帮助你。

于 2018-04-27T13:16:00.317 回答