经验不在于年限,在于积累---专注互联网软件开发

把工作当事业做,把项目当作品做!

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  55 Posts :: 0 Stories :: 66 Comments :: 0 Trackbacks

  利用Hadoop分析BHO上报日志时,发现很多日志文件会出现下面的错误:

clip_image002

  即在map结束的时候抛出Java堆栈溢出异常!

(友情提示:本博文章欢迎转载,但请注明出处:hankchen,http://www.blogjava.net/hankchen

  首先设置下面的参数:

clip_image004

发现还是解决不了问题。开始怀疑代码问题,于是进行了一系列的优化:

clip_image006

主要的优化是,在map和reduce程序中,重用key和value对象。但是发现还是解决不了问题。并且mapred.child.java.opts设置3G也无济于事。

没有办法,只好继续找原因。最后发现一个规律:报这个异常出错的日志不一定是最大的日志。

只好使用最后一招了,直接分析报错时的Java堆内存情况!

再次出现异常的时候,把集群里面所有的机器的Hadoop进程的堆内存导出来分析!

主要是下面的几类进程:

clip_image008

同时,关注每台机器的top命令输出,可以从内存的使用情况中发现主要是哪台机器出问题!然后重点导出这台机器的Java堆参数!

jmap -dump:live,format=b,file=heapt0923.bin pid

clip_image010

剩下来的就是把/data/bhopid_output/heapt0923.bin这个文件复制到本地,利用Eclipse Memory Analyzer Tool 进行分析!

下面是分析的结果:

clip_image012

发现有两个内存泄漏的情况:

1、

clip_image014

2、

clip_image016

找到根本原因:说明日志文件有这样很大的空记录导致的!在代码中把这些记录忽略掉即可!

clip_image002[11]

 

(友情提示:本博文章欢迎转载,但请注明出处:hankchen,http://www.blogjava.net/hankchen

posted on 2012-03-21 17:52 hankchen 阅读(8769) 评论(0)  编辑  收藏 所属分类: 工作感悟

只有注册用户登录后才能发表评论。


网站导航: