重新启动Hadoop(Secondary)Namenode时僵尸进程阻塞端口

我对Hadoop Namenode和Secondary Namenode有奇怪的问题。 我们的HDFS群集大部分时间都能顺利运行。 但是,无时无刻不在主要名称节点冻结(崩溃整个集群),或者次要名称节点冻结并停止制作检查点。

每当发生这种情况,我尝试重新启动挂起的服务失败,因为端口仍然被阻止:

# service hadoop-namenode restart * Stopping Hadoop namenode: no namenode to stop * Starting Hadoop namenode: starting namenode, logging to /var/log/hadoop/hadoop-hdfs-namenode-HOST.out Error: Exception thrown by the agent : java.rmi.server.ExportException: Port already in use: 26100; nested exception is: java.net.BindException: Address already in use 

但是,检查ps auxw的输出,没有Namenode正在运行。 检查哪个进程阻塞了端口:

 # netstat -tulpen | grep 26100 tcp 0 0 0.0.0.0:26100 0.0.0.0:* LISTEN 6001 20067 - 

这根本没有帮助。 它说,港口正在使用,但过程是-

ss也没有更多的帮助:

 # ss -apne | grep 26100 tcp LISTEN 34 50 *:26100 *:* uid:6001 ino:20067 sk:000015c1 <-> tcp CLOSE-WAIT 224 0 127.0.0.1:26100 127.0.0.1:56770 ino:0 sk:00000527 --> ... tcp CLOSE-WAIT 13 0 127.0.0.1:26100 127.0.0.1:56762 ino:0 sk:0000078f --> tcp CLOSE-WAIT 17 0 127.0.0.1:26100 127.0.0.1:56772 ino:0 sk:000007b1 --> 

这两个命令告诉我的唯一的事情就是这个进程是由hdfs用户UID 6001拥有的。 检查ps auxw hdfs拥有的任何进程我可以看到有一个僵尸进程:

 hdfs 4947 4.8 0.0 0 0 ? Zl Feb23 435:50 [java] <defunct> 

所以出于任何原因,重新启动Namenode服务会留下一个继续阻塞端口的僵尸。 不幸的是,我无法摆脱这个过程,因为唯一的父进程是init

 # pstree -ps 4947 init(1)───java(4947)───{java}(9957) 

唯一的解决方法是重新启动操作系统(无问题)或临时使用Namenode(或Secondary Namenode)的另一个端口。

你有什么想法这个怪异的错误可能是什么原因? 在dmesg我找不到任何提示。

集群有130个节点,每个节点运行Ubuntu 14.04 Trusty,内核为4.2.0-30-generic#35〜14.04.1-Ubuntu。 Hadoop版本是2.7.1。