一次Hadoop服务器进程挂掉的原因分析


今天早上,收到Zabbix的报警,hadoop-new-5的三个进程datanode,tasktracker和hbase都挂掉了。
于是登陆到该服务器,首先Copy log,然后启动服务。
接着对log进行查看,发现三个进程都是在服务器时间18:47分左右挂掉的,而log文件中都是在没有关联的ERROR与WARN的情况下突然中止的。
因此在log中并未找到原因,于是查看Zabbix中服务器的资源情况统计,发现内存比较吃紧,最低的时候Free memory不足18M,不过目前其它几个Hadoop服务器的内存情况也基本一致。

于是查看系统日志,发现了对应的线索。
# dmesg | grep java

由于JVM的Out of memory 导致了操作系统执行kill指令杀掉了所有Java进程。
===========

[8288555.635268] Out of memory: kill process 1533 (java) score 207630 or a child
[8288555.635288] Killed process 1533 (java) vsz:830520kB, anon-rss:318624kB, file-rss:4632kB
[8288555.889317] Killed process 14847 (java) vsz:1763768kB, anon-rss:565000kB, file-rss:4644kB
[8288555.924976] Killed process 15014 (java) vsz:1368968kB, anon-rss:123004kB, file-rss:4668kB
[8288556.044819] Out of memory: kill process 15301 (java) score 8269 or a child
[8288556.044833] Killed process 15301 (java) vsz:1455372kB, anon-rss:1115116kB, file-rss:4368kB
==========
于是,考虑是否能够通过JVM调优来做一些优化,目前服务器上总共有5个这样的java进程,每个进程仅设置了heap size,未作GC方面的调优。
# ps aux | grep java
java -Dproc_tasktracker -Xmx1000m -Dhadoop.log.dir=/usr/lib/hadoop-0.20/logs ... r org.apache.hadoop.mapred.TaskTracker

过去我有过与Redhat公司负责JBoss支持的工程师的网上直接交流(购买了RHN服务),得到过一些针对GC优化的建议,效果显著。
但在我查看了目前Hadoop服务器的CPU之后,感到有些无奈,目前的Hadoop服务器是单核CPU,而GC优化的核心思想是利用多核的特征实现并行GC。
因此在现有的服务器硬件条件上难以做好JVM的相关调优。
# cat /proc/cpuinfo
===========
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 44
model name : Intel(R) Xeon(R) CPU E5645 @ 2.40GHz

因此,针对目前的服务器情况,应该在适当的时候考虑将服务器升级到多核CPU版本,和增加更多的内存了。

, ,

  1. No comments yet.
(will not be published)
*