利用Hadoop分析BHO上报日志时,发现很多日志文件会出现下面的错误:
即在map结束的时候抛出Java堆栈溢出异常!
(友情提示:本博文章欢迎转载,但请注明出处:hankchen,http://www.blogjava.net/hankchen)
首先设置下面的参数:
发现还是解决不了问题。开始怀疑代码问题,于是进行了一系列的优化:
主要的优化是,在map和reduce程序中,重用key和value对象。但是发现还是解决不了问题。并且mapred.child.java.opts设置3G也无济于事。
没有办法,只好继续找原因。最后发现一个规律:报这个异常出错的日志不一定是最大的日志。
只好使用最后一招了,直接分析报错时的Java堆内存情况!
再次出现异常的时候,把集群里面所有的机器的Hadoop进程的堆内存导出来分析!
主要是下面的几类进程:
同时,关注每台机器的top命令输出,可以从内存的使用情况中发现主要是哪台机器出问题!然后重点导出这台机器的Java堆参数!
jmap -dump:live,format=b,file=heapt0923.bin pid
剩下来的就是把/data/bhopid_output/heapt0923.bin这个文件复制到本地,利用Eclipse Memory Analyzer Tool 进行分析!
下面是分析的结果:
发现有两个内存泄漏的情况:
1、
2、
找到根本原因:说明日志文件有这样很大的空记录导致的!在代码中把这些记录忽略掉即可!
(友情提示:本博文章欢迎转载,但请注明出处:hankchen,http://www.blogjava.net/hankchen)