Удаленный доступ к namenode не разрешен, несмотря на то, что сервисы уже запущены.

Я успешно установил и запустил Hadoop на одной машине с IP-адресом 192.168.1.109 (на самом деле это экземпляр Ubuntu, работающий в виртуальной коробке) . При наборе jps показывает

2473 DataNode

2765 TaskTracker

3373 Jps

2361 NameNode

2588 SecondaryNameNode

2655 JobTracker

Это должно означать, что hadoop запущен и работает. Запуск таких команд, как./hadoop fs -ls - это нормально и дает ожидаемый результат.

Но если я попытаюсь подключить его из окна Windows с IP-адресом 192.168.1.80, написав API-интерфейс HDFS для кода Java, подключите его следующим образом:

Конфигурация conf = новая конфигурация ();

Файловая система hdfs = null;

Путь filenamePath = новый путь (FILE_NAME);

hdfs = FileSystem.get (conf); <- проблема возникла на этой линии

когда я запускаю код, ошибка отображается следующим образом:

12.11.07 20:37:24 INFO ipc.Client: повторная попытка подключения к серверу: /192.168.1.109:9000. Уже пробовал 0 раз.

12.11.07 20:37:26 INFO ipc.Client: повторная попытка подключения к серверу: /192.168.1.109:9000. Уже пробовал 1 раз.

12.11.07 20:37:28 INFO ipc.Client: повторная попытка подключения к серверу: /192.168.1.109:9000. Уже пробовал 2 раз.

12.11.07 20:37:30 INFO ipc.Client: повторная попытка подключения к серверу: /192.168.1.109:9000. Уже пробовал 3 раз.

12.11.07 20:37:32 INFO ipc.Client: повторная попытка подключения к серверу: /192.168.1.109:9000. Уже пробовал 4 раз.

12.11.07 20:37:33 INFO ipc.Client: повторная попытка подключения к серверу: /192.168.1.109:9000. Уже пробовал 5 раз.

12.11.07 20:37:35 INFO ipc.Client: повторная попытка подключения к серверу: /192.168.1.109:9000. Уже пробовал 6 раз.

12.11.07 20:37:37 INFO ipc.Client: повторная попытка подключения к серверу: /192.168.1.109:9000. Уже пробовал 7 раз.

12.11.07 20:37:39 INFO ipc.Client: повторная попытка подключения к серверу: /192.168.1.109:9000. Уже пробовал 8 раз.

12.11.07 20:37:41 INFO ipc.Client: повторная попытка подключения к серверу: /192.168.1.109:9000. Уже пробовал 9 раз.

java.net.ConnectException: вызов /192.168.1.109:9000 завершился ошибкой при исключении соединения: java.net.ConnectException: соединение отклонено: нет дополнительной информации

Чтобы убедиться, что сокет уже открыт и ожидает входящих подключений на сервере hasoop, я netstat на окне ubuntu, результат выглядит следующим образом:

tcp 0 0 localhost: 51201 : СЛУШАТЬ 2765 / Java
tcp 0 0 *: 50020 : СЛУШАТЬ 2473/ Java
tcp 0 0 localhost: 9000 : СЛУШАТЬ 2361 / Java
tcp 0 0 localhost: 9001 : СЛУШАТЬ 2655 / Java
tcp 0 0 *: mysql : LISTEN -
tcp 0 0 *: 50090 : СЛУШАТЬ 2588/ Java
tcp 0 0 *: 11211 : СЛУШАТЬ -
tcp 0 0 *: 40843 : СЛУШАТЬ 2473/ Java
tcp 0 0 *: 58699 : СЛУШАТЬ -
tcp 0 0 *: 50060 : СЛУШАТЬ 2765 / Java
tcp 0 0 *: 50030 : СЛУШАТЬ 2655 / Java
tcp 0 0 *: 53966 : СЛУШАТЬ 2655 / Java
tcp 0 0 *: www : LISTEN -
tcp 0 0 *: epmd : LISTEN -
tcp 0 0 *: 55826 : СЛУШАТЬ 2588/ Java
tcp 0 0 *: ftp : LISTEN -
tcp 0 0 *: 50070 : СЛУШАТЬ 2361 / Java
tcp 0 0 *: 52822 : СЛУШАТЬ 2361 / Java
tcp 0 0 *: ssh : СЛУШАТЬ -
tcp 0 0 *: 55672 : СЛУШАТЬ -
tcp 0 0 *: 50010 : СЛУШАТЬ 2473/ Java
tcp 0 0 *: 50075 : СЛУШАТЬ 2473/ Java

Я заметил, что если локальный адресный столбец похож на localhost: 9000 (начинается с localhost: not *:), он не сможет быть подключен с удаленного хоста или даже в своем собственном окне в некоторых случаях. Я попытался telnet localhost 9000, он работает, я имею в виду, что он может подключиться к порту, но если я использую telnet 192.168.1.109 9000, ошибки отображаются как

$ telnet 192.168.1.109 9000 Trying 192.168.1.109... telnet: невозможно подключиться к удаленному хосту: соединение отказано

Я потратил почти неделю на то, чтобы разобраться в проблеме, которую я действительно исчерпал, и я надеюсь, что кто-нибудь сможет мне помочь.

Примечание: я не уверен, что по умолчанию наменоде отказывается от удаленного подключения. Нужно ли менять некоторые настройки, чтобы разрешить удаленные подключения?

3 ответа

Решение

Изменить значение fs.default.name в hdfs://106.77.211.187:9000 от hdfs://localhost:9000в core-site.xml как для клиента, так и для NameNode. Замените IP-адрес IP-адресом узла, на котором работает NameNode, или именем хоста.

Был способен telnet 106.77.211.187 9000 и вот вывод netstat -a | grep 9000

tcp6 0 0 106.77.211.187:9000 [::]: * LISTEN
tcp6 0 0 106,77,211,187:50753 106,77,211,187%819:9000 УСТАНОВЛЕНО
tcp6 0 0 106,77,211,187:9000 106,77,211,187%81:50753 УСТАНОВЛЕНО

Что касается того, почему исходный код выглядит следующим образом для fs.default.name со значением localhost

Сокет ServerSocket = новый сокет ServerSocket (9000);
socket.bind (локальный);

Поскольку адрес привязки назначен localhost, процесс namenode может принимать соединение только с localhost. Если адрес привязки назначен на имя машины или IP-адрес, то процесс namenode может принять любое соединение с удаленной машины.

Я заменил все localhost с его IP-адресом во всех файлах конфигурации, теперь он работает нормально.

Проверьте /etc/hosts файл и убедитесь, что у вас есть IP-адрес, связанный с полным именем вашего узла (FQN). Пример:

127.0.0.1      localhost localhost.localdomain localhost4 localhost4.localdomain4
::1            localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.100.11 node1.mydomain.com node1
192.168.100.12 node2.mydomain.com node2 

В моем случае у меня была строка 127.0.0.1 node1.mydomain.com что было определенно неправильно.

Я столкнулся с той же проблемой, но смог исправить ее, выполнив следующие действия. В качестве виртуальных машин CentOS7 VirtualBox у меня были ведущий и ведомые устройства hadoop, и я не мог получить доступ к веб-интерфейсам с хоста Windows, используя IP-адрес и порт главного узла. Убедитесь, что вы выполните следующие шаги, чтобы исправить это;

  1. Как упоминалось в других постах, убедитесь, что файл / etc / hosts заполнен правильно
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4

::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

172.10.2.20     hdp-master1.hadoop.cluster      hdp-master1

172.10.2.21     hdp-slave1.hadoop.cluster       hdp-slave1

172.10.2.22     hdp-slave2.hadoop.cluster       hdp-slave2
  1. И во всех ваших XML-файлах hadoop используйте полное имя хоста или ip вместо localhost, как уже упоминали другие

  2. Добавьте следующую запись в hdfs-site.xml, чтобы заставить порт веб-интерфейса работать с ip вместо 0.0.0.0:9870

<property>
        <name>dfs.namenode.http-address</name>
        <value>hdp-master1.hadoop.cluster:9870</value>
</property>
  1. Добавьте следующую запись в yarn-site.xml, чтобы заставить порт веб-интерфейса менеджера ресурсов запускаться из ip вместо 0.0.0.0:8088
<property>
        <name>yarn.resourcemanager.webapp.address</name>
        <value>hdp-master1.hadoop.cluster:8088</value>
</property>

<property>
        <name>yarn.resourcemanager.webapp.https.address</name>
        <value>hdp-master1.hadoop.cluster:8090</value>
</property>
  1. Остановите и запустите все службы, используя start-all.sh. Просто чтобы быть в безопасности, я побежал hdfs namenode -format сначала до перезапуска сервисов

  2. использование netstat -tulnp на главном узле и убедитесь, что веб-порты работают на основе IP

    netstat -tulnp
    
    tcp 0 0 172.16.3.20:8088 0.0.0.0:* LISTEN 14651/java
    tcp 0 0 172.16.3.20:9870 0.0.0.0:* LISTEN 14167/java
    
  3. Даже после всего этого я все еще не мог получить доступ с хоста windows, и виновником был брандмауэр на узлах hadoop. Поэтому остановите остановку брандмауэра на всех главных и подчиненных узлах, как показано ниже

Check status
------------
systemctl status firewalld

Stop Firewall
-------------
systemctl stop firewalld

Disable from Startup
--------------------
systemclt disable firewalld

Теперь вы должны иметь доступ к хосту Windows через веб-браузер. У меня были записи, добавленные в файл хостов Windows, так что даже следующее работало

http://hdp-master1.hadoop.cluster:9870
http://hdp-master1.hadoop.cluster:8088

Надеюсь это поможет

Другие вопросы по тегам