Hadoop DataNode дает мне несовместимый идентификатор пространства имен
Когда я запускаю скрипт start-all.sh из моего главного узла, некоторые из моих узлов данных не запускаются; файл журнала сообщает об исключительной ситуации IOException: несовместимые идентификаторы пространства имен в /tmp/$MY_USER_NAME.
2 ответа
Когда NameNode отформатирован, генерируется идентификатор пространства имен, который по существу идентифицирует этот конкретный экземпляр распределенной файловой системы. Когда узлы DataNode впервые подключаются к узлу NameNode, они сохраняют этот идентификатор пространства имен вместе с блоками данных, поскольку блоки должны принадлежать определенной файловой системе.
Если впоследствии DataNode подключается к NameNode, а идентификатор пространства имен, который объявляет NameNode, не совпадает с идентификатором пространства имен, хранящимся в DataNode, он откажется работать с ошибкой "несовместимый идентификатор пространства имен". Это означает, что DataNode подключился к другому NameNode, и блоки, которые он хранит, не принадлежат этой распределенной файловой системе.
Обычно это означает, что вы как-то потеряли метаданные NameNode. Если у вас несколько установок HDFS, ваш DataNode может подключаться к неправильному NameNode. Если у вас есть только одна установка, то ваш NameNode либо работает с другим каталогом метаданных, либо вы каким-то образом потеряли метаданные и начали с недавно отформатированной файловой системы (что должно произойти только при запуске hadoop namenode -format
). Попробуйте найти правильные метаданные NameNode или восстановить их из резервной копии.
Каждый раз, когда NameNode переформатирует, он генерирует новый ID пространства имен, и некоторые из ваших машин не получили памятку. Самый простой способ решить эту проблему - переформатировать распределенную файловую систему; извлеките любые файлы из HDFS, затем запустите rm -Rf /tmp/hadoop-$MY_USER_NAME
на каждом сервере (путь к каталогу может отличаться в зависимости от вашей конфигурации). Тогда беги hadoop namenode -format
с вашего главного сервера. После этого, bin/start-all.sh
должен сделать свое дело.