У меня странные проблемы с Hadoop Namenode и Secondary Namenode. Наш кластер HDFS большую часть времени работает без сбоев. Но время от времени либо основной Namenode зависает (сбой всего кластера), либо Secondary 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.