之前有一篇文章,分析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超过最大值时,直接被删除了
文章仔细分析了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大小