Hadoop userlog日志丢失原因

本文分析了Hadoop中用户日志丢失的原因,主要与`mapred.userlog.limit.kb`配置有关。当用户日志大小超过限制时,会引发内存溢出或日志丢失。通过TaskLogAppender的逻辑,当tail队列超过最大事件数时,旧的日志会被删除。为解决此问题,建议放宽用户端的日志控制,并采用crontab脚本定期管理userlog大小。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前有一篇文章,分析Hadoop日志限制(http://blog.youkuaiyun.com/bxyz1203/article/details/8107125)
文章仔细分析了MR中Java,Streaming,pipes三种Job方式对Log日志的限制情况
在实际使用中,我们发现用户自定义输入的log太多,userlog硬盘增大,导致磁盘过满,影响TaskTracker执行
由此我们用mapred.userlog.limit.kb限制了userlog的大小为10M,但这样同样可个问题,限制userlog大小后,这个10M
的大小将被加载至内存当,如果用户需求输出的日志过大,则会导致内存溢出的问题,但是做限制,会出现用户日志丢失
的问题,下面分析下mapred.userlog.limit.kb的作用过程,以解释其原因

TaskLog |获取配置参数
|-->getTaskLogLength()
     |-->return conf.getLong("mapred.userlog.limit.kb", 100) * 1024;

TaskRunner调用
|-run()
  |-->long logSize = TaskLog.getTaskLogLength(conf);
  |-->Vector<String> vargs = getVMArgs(taskid, workDir, classPaths, logSize);
       |-->setupLog4jProperties(vargs, taskid, logSize);
        |-->vargs.add("-D" + TaskLogAppender.LOGSIZE_PROPERTY + "=" + logSize);
            |-->static final String LOGSIZE_PROPERTY = "hadoop.tasklog.totalLogFileSize";  |TaskLogAppender中静态参数

TaskLogAppender解析env参数
|-->setOptionsFromSystemProperties()
     |-->if (maxEvents == null)
          String propValue = System.getProperty(LOGSIZE_PROPERTY, "100");
          setTotalLogFileSize(Long.valueOf(propValue));  |设置userlog的maxevent大小
|-->append() 
        |--> if (tail == null) |append时以一个LoggingEvent对象加入tail队列当中
          super.append(event);
        |--> else {
           if (tail.size() >= maxEvents) |假如当前大小已经大于userlog设置值,则删除当前值
                tail.remove();
        |-->
           tail.add(event); |继续添加
     
由append代码可知,userlog日志丢失是因为tail超过最大值时,直接被删除了
解决方案可深度放开用户端userlog控制,但设置crontab脚本来userlog大小
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值