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

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

我在 Hadoop Namenode 和 Secondary Namenode 方面遇到了一些奇怪的问题。我们的 HDFS 集群大部分时间运行顺利。但时不时地,主 Namenode 会冻结(导致整个集群崩溃),或者辅助 Namenode 会冻结并停止创建检查点。

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

# 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 -->

这两个命令唯一告诉我的是,该进程由 UID 6001(即用户)拥有hdfs。检查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。

相关内容