Удаленный доступ к 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-адрес и порт главного узла. Убедитесь, что вы выполните следующие шаги, чтобы исправить это;
- Как упоминалось в других постах, убедитесь, что файл / 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
И во всех ваших XML-файлах hadoop используйте полное имя хоста или ip вместо localhost, как уже упоминали другие
Добавьте следующую запись в hdfs-site.xml, чтобы заставить порт веб-интерфейса работать с ip вместо
0.0.0.0:9870
<property> <name>dfs.namenode.http-address</name> <value>hdp-master1.hadoop.cluster:9870</value> </property>
- Добавьте следующую запись в 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>
Остановите и запустите все службы, используя start-all.sh. Просто чтобы быть в безопасности, я побежал
hdfs namenode -format
сначала до перезапуска сервисовиспользование
netstat -tulnp
на главном узле и убедитесь, что веб-порты работают на основе IPnetstat -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
Даже после всего этого я все еще не мог получить доступ с хоста 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
Надеюсь это поможет