记一则Hadoop DataNode OOM故障,以及解决方案

一、故障症状

   最近公司一个集群跑大任务时,datanode日志报DataXceiveServer: Exiting due to:java.lang.OutOfMemoryError: unable to create new native thread异常,然后计算节点上的DataNode直接挂掉。DataNode异常日志截图如下:

2014-03-06 03:41:05,881 ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: DatanodeRegistration(172.16.8.5:50010, storageID=DS-2085721072-172.16.8.5-50010-1386684967398, infoPort=50075, ipcPort

=50020):DataXceiveServer: Exiting due to:java.lang.OutOfMemoryError: unable to create new native thread

TaskTracker上的异常日志信息:


2014-03-06 03:43:52,760 ERROR org.apache.hadoop.security.UserGroupInformation: PriviledgedActionException as:job_201403051809_0018 cause:java.io.IOException: Unknown task; attempt_201403051809_0018_r_000000_0. Ignoring getMapCompletionEvents Request

2014-03-06 03:43:52,760 ERROR org.apache.hadoop.security.UserGroupInformation: PriviledgedActionException as:job_201403051809_0018 cause:java.io.IOException: Unknown task; attempt_201403051809_0018_r_000000_0. Ignoring getMapCompletionEvents Request


二、解决故障思路分析

    从TaskTracker的异常日志来看,报的是一个IO异常,反应的情况是无法从HDFS中获取到job的信息,另外日志中的“Ignoring getMapCompletionEvents Request”则是Reduce Task中的GetMapEventsThreads线程抛出的,该线程的主要作用是周期性通过RPC从TaskTracker获取已经完成的Map Task列表,为shuffle阶段做准备的。再联系DataNode上的异常日志信息我们知道DataNode进程由于出现OOM而挂掉了,那么在TaskTracker中获取不到HDFS上的作业信息也就可以解析了,因此得出一个结论:TaskTracker中的异常是由于DataNode进程挂掉引起的。接下来,将精力转到DataNode上的OOM分析。

   TaskTracker报OOM异常我们见多了,最常见的就是reduce阶段的内存溢出,另外可能在map阶段中的sort和spill中,也就是io.sort.mb参数所控制的环形内存所做的快速排序上出现内存溢出,但是map阶段的内存溢出几率还是比较少的,因为通常默认情况下一个map只是处理一个数据块(一个block左右的大小),而且一般io.sort.mb设置都比一个block大小要大。另外TaskTracker上的OOM还可以通过mapred.map.child.java.opts来进行调整。那么对于现在这种情况,在DataNode上出现OOM,第一感觉是不是HADOOP_HEAPSIZE配置的太小了导致DataNode和TaskTracker进程不够内存用(这个值使用默认的1000m)?但是仔细想想觉得不怎么可能,因为集群是刚刚部署不久的,数据存储量还不是很多。但是为了测试还是将HADOOP_HEAPSIZE调到了2000,再跑任务测试,不幸的是DataNode还是出现OOM,进而挂掉。此时,我想会不会是什么配置限制了内存的使用或者限制了新线程的创建?于是看看系统的限制参数,如下图:

wKioL1MaD4byGkhoAAI2j9TUy2E154.jpg

看了上面的参数,open files是当初改大了的,max user processes这个参数是系统默认的1024。起初对这个变量值的认识只是认为它仅仅限制了系统的最大进程数,又为了安全起见上网查查看,惊喜地发现,原来这个参数会对系统中所有application创建的总线程数有限制的(具体情况请参考:http://www.iteye.com/topic/654172)。这样一下子明白什么回事了,将max user processes调大,调到81920(可以直接在bash_profiles添加ulimit -u 81920进行设置)。设置完了,如图:

wKiom1MaEkKgddhrAAIw-Lu4XBE313.jpg

起任务再跑,观察DataNode日志,一切正常,不会出现OOM,稳!!


二、总结

    OOM是hadoop集群运行时比较容易出现的故障,其解决方案也各有不同,要看实际情况而定。对于在Map或者reduce出现的OOM故障还是比较容易处理的,具体的可以看上面分析,对于DataNode中的OOM故障,其原因还是比较隐蔽的,需要一定的运维知识和工作经验的积累。哎,都深夜了,就记录这么多了,睡觉!!



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/291746.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阿里云实时数据仓库

阿里云实时数据仓库——学习笔记 课程目标 学习搭建一个实时数据仓库,掌握数据采集、存储、计算、输出、展示等整个业务流程。整个实时数据仓库系统是在阿里云架构上搭建,掌握并学会运用各个服务组件,及各个组件之间如何联动。前置知识要求&…

[转]svn常用命令

谢谢原作者:http://blog.sina.com.cn/s/blog_963453200101eiuq.html 1、检出svn co http://路径(目录或文件的全路径) [本地目录全路径] --username 用户名 --password 密码svn co svn://路径(目录或文件的全路径) [本地目录全路径] --username 用户名 --password 密码…

手动挡五个档位示意图_汽车档位越多越好?听听专业回答

如今的汽车市场百花齐放,汽车厂商们也不断在研发过程中寻找不同的突破口,其中汽车变速器的档位变化就是众多汽车品牌当做噱头的重点,不知从什么时候开始,自动变速箱档位数量变多成为了深受汽车品牌喜爱的突破点,渐渐的…

常用排序-基数排序,计数排序

基数排序 将整数每个位数分别比较,先找出最长位,针对每个位(个位,十位…)利用桶的思想,将每个位的元素个数统计,倒序读入temp[10]列表中, 时间复杂度O(d(nK)),k是10进制,…

Android之用netcfg命令获取手机虚拟网卡tun0的信息

1、在终端输入下面命令 adb shell adb netcfg 2、展示结果 3、使用总结 我们得到手机 tun0 地址为10.1.102.11 然后在vpn后台,我们先找到是哪个tun,我们可以使用ip route命令ip route show table2 这个允许结果就是 地址 哪个tun比如我们得到是tun2 然…

C# 基于事件的异步模式

点击蓝字 关注我们开工大吉EventBasedAsyncPattern 方法使用了基于事件的异步模式。这个模式定义了一个带有 “Async” 后缀的方法。示例代码再次使用了WebClient 类。对于同步方法DownloadString,WebClient类提供了一个异步变体方法 DownloadStringAsync。当请求完…

Tomcat 下 Memcached 集群与 Terracotta 集群比较

总结:Terracotta 集群配置要比Memcached 集群简单,但Terracotta 集群启动的速度要比Memcached 集群慢,性能Terracotta 集群要比Memcached 集群好。但性能都好不过weblogic单机的性能!! Terracotta 集群效果图如下&…

POJ 2887 Big String

Big StringTime Limit: 1000MS Memory Limit: 131072KTotal Submissions: 7053 Accepted: 1684Description You are given a string and supposed to do some string manipulations.Input The first line of the input contains the initial string. You can assume that it …

MySQL For RedHat Linux(源码安装,附安装包)

准备工作在http://pan.baidu.com/s/1GsS3s下载安装包 Mysql.zip把相应的包放在 /opt 目录下 解压mysql.tar.gz 检测系统是否安装MySQL1、执行 #rpm -qa | grep -i mysql如果出现:[rootlocalhost Mysql]# rpm -qa|grep -i mysql [rootlocalhost Mysql]# 则未安装MySQ…

IDEA简单配置教程

IDEA简单配置教程 ——做好前期配置工作,后期少走弯路。 创建模块(Module) 设置(Settings) 设置主题 窗体及菜单字体及大小 设置编辑区主题 通过插件(plugins)更换主题 设置鼠标滚轮修改字体大小 设置鼠标悬浮提示 设置自动导包功能 显示行号和方法间的分隔符 忽略…

Android之解决打补丁包后移动端为什么不升级,升级之后出现“应用未安装“,以及更新成功之后反复更新问题

1、打补丁包后移动端为什么不升级,而且PC端和移动端访问同一个url得到的xml文件内容不一致 不升级是因为补丁包文件搞错了,虽然改了文件内容, pc端访问同一个url得到的xml文件内容不一致,是以为服务端集群导致。 总结: 1)、给客户打补丁包之前一定要到客户后台把相关文件…

MariaDB Spider 数据库分库分表实践 分库分表

分库分表一般来说,数据库分库分表,有以下做法:按哈希分片:根据一条数据的标识计算哈希值,将其分配到特定的数据库引擎中;按范围分片:根据一条数据的标识(一般是值)&#…

【树莓派】配置介绍

网络是个好东西,好多同学分享的博文,极大的方便我们学习,谢谢~ 1、初始化配置树莓派 装上新系统,连接到树莓派后,一切都是新的,需要配置树莓派的一些选项。 使用putty连接到树莓派后,输入指令su…

C语言之函数指针和函数的首地址

1、爆简单的代码 因为容易忘记,还是再记录一次吧。 2、展示结果 至于函数指针用法,一眼便知对于add和&add你应该这样理解,add是函数的首地址,它的类型是void (),&add表示一个指向函数add这个对象的地址&#x…

halcon ocr 生成样本变体_Halcon简单文字识别OCR的使用

重要:本文最后更新于2019-10-18 08:49:28,某些文章具有时效性,若有错误或已失效,请在下方留言或联系代码狗。突然想起网上有很多打码挣钱的活动,于是灵光一闪,用C#搞个自动识别验证码的程序出来岂不是自动挣…

Ajax入门(创建 XMLHttpRequest 对象)

XMLHttpRequest 是 AJAX 的基础。 所有现代浏览器均支持 XMLHttpRequest 对象(IE5 和 IE6 使用 ActiveXObject)。 XMLHttpRequest 用于在后台与服务器交换数据。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。 创建 XML…

MFC中卡拉OK字体的定时器实现,使用DC的DrawText函数实现

1 void CTextView::OnTimer(UINT_PTR nIDEvent)2 {3 m_nWidth 5; // 在构造函数中初始化为 0;4 5 CClientDC dc( this );6 TEXTMETRIC tm;7 dc.GetTextMetrics( &tm );8 CRect rect;9 rect.left 0; 10 rect.top 200; 11 re…

WPF 基础控件之Window样式

WPF开发者QQ群: 340500857由于微信群人数太多入群请添加小编微信号yanjinhuawechat 或 W_Feng_aiQ 邀请入群需备注WPF开发者 PS:有更好的方式欢迎推荐。01—代码如下一、创建 Window.cs继承System.Windows.Window代码如下。在WPF自定义类库时需要注意在创…

ngModel 值不更新/显示

angular中的$scope是页面(view)和数据(model)之间的桥梁,它链接了页面元素和model,也是angular双向绑定机制的核心。 而ngModel是angular用来处理表单(form)的最重要的指令&#xff…

linux c之使用pthread_create创建线程pthread_join等待线程和pthread_exit终止线程总结

1、介绍API 1、pthread_create函数 函数简介 pthread_create是UNIX环境创建线程函数 头文件 #include<pthread.h> 函数声明 int pthread_create(pthread_t *restrict tidp,const pthread_attr_t *restrict_attr,void*(*start_rtn)(void*),void *restrict arg); 返回值…