代码之家  ›  专栏  ›  技术社区  ›  Eric Wendelin

配置hadoop日志以避免日志文件过多

  •  11
  • Eric Wendelin  · 技术社区  · 15 年前

    我遇到了hadoop在$hadoop_log_dir/userlogs(ext3文件系统只允许32000个子目录)中生成太多日志文件的问题,在这个问题上看起来是相同的问题: Error in Hadoop MapReduce

    我的问题是:是否有人知道如何配置hadoop来滚动日志目录或防止这种情况?我试图避免仅仅设置“mapred.userlog.retain.hours”和/或“mapred.userlog.limit.kb”属性,因为我想实际保留日志文件。

    我也希望在log4j.properties中对此进行配置,但是在hadoop 0.20.2源代码中,它直接写入日志文件而不是实际使用log4j,也许我不理解它是如何完全使用log4j的。

    如有任何建议或澄清,将不胜感激。

    5 回复  |  直到 9 年前
        1
  •  4
  •   Chase    15 年前

    不幸的是,没有一种可配置的方法来防止这种情况。作业的每个任务都会在history/userlogs中得到一个目录,其中包含stdout、stderr和syslog任务日志输出文件。保留时间将有助于防止太多的时间积累,但您必须编写一个良好的日志旋转工具来自动对它们进行柏油。

    我们在写入nfs装载时也遇到了这个问题,因为所有节点都将共享相同的history/userlogs目录。这意味着一个有30000个任务的工作就足以打破fs。当集群实际开始处理大量数据时,本地日志记录实际上是一种方法。

    如果您已经在本地登录,并且在不到一周的时间内仍然能够在一台计算机上处理30000多个任务,那么您可能正在创建太多的小文件,从而导致为每个作业生成太多映射程序。

        2
  •  5
  •   Jon Snyder    15 年前

    我也有同样的问题。在启动hadoop之前,设置环境变量“hadoop_root_logger=warn,console”。

    export HADOOP_ROOT_LOGGER="WARN,console"
    hadoop jar start.jar
    
        3
  •  2
  •   milan    15 年前

    配置hadoop以使用log4j并设置

    log4j.appender.FILE_AP1.MaxFileSize=100MB
    log4j.appender.FILE_AP1.MaxBackupIndex=10
    

    就像上面描述的 this wiki page 不起作用?

    看着 LogLevel source code ,似乎hadoop使用commons日志记录,默认情况下它将尝试使用log4j,如果log4j不在类路径上,则使用jdk日志记录。

    顺便说一下,可以在运行时更改日志级别,查看 commands manual .

        4
  •  1
  •   Stephen C    15 年前

    根据文件, Hadoop uses log4j for logging . 也许你找错地方了…

        5
  •  0
  •   Community CDub    8 年前

    我也遇到了同样的问题…配置单元会产生大量日志,当磁盘节点已满时,将无法启动更多容器。在yarn中,当前没有禁用日志记录的选项。一个特别大的文件是syslog文件,在我们的例子中,它在几分钟内生成了几GB的日志。

    在“yarn site.xml”中将属性yarn.nodemanager.log.retain-seconds配置为较小的值没有帮助。无法将“yarn.nodemanager.log dirs”设置为“file:///dev/null”,因为需要一个目录。删除writing ritght(chmod-r/logs)也不起作用。

    一种解决方案是使用“空黑洞”目录。在这里检查: https://unix.stackexchange.com/questions/9332/how-can-i-create-a-dev-null-like-blackhole-directory

    另一个解决方案是在运行作业之前禁用日志。例如,在配置单元中,通过以下行启动脚本是可行的:

    set yarn.app.mapreduce.am.log.level=OFF;
    set mapreduce.map.log.level=OFF;
    set mapreduce.reduce.log.level=OFF;