不允许远程访问namenode,尽管服务已经启动



我成功地在一台ip为192.168.1.109的机器上安装并运行了Hadoop(实际上它实际上是一个运行在虚拟机上的Ubuntu实例)。当输入jps时,显示

2473 DataNode

2765 TaskTracker

3373 Jps

然后2361

2588 SecondaryNameNode

JobTracker 2655

这应该意味着hadoop已经启动并运行。运行像。/hadoop fs -ls这样的命令就可以了,并且会产生预期的结果。

但是,如果我试图从ip为192.168.1.80的windows盒子通过写入连接它Java代码的HDFS API连接如下:

Configuration conf = new Configuration();

FileSystem hdfs = null;

Path filenamePath = new Path(FILE_NAME);

hdfs = filessystem .get(conf);<——问题发生在这一行>

当我运行代码时,错误显示如下:

11/12/07 20:37:24 INFO ipc。Client: Retrying connect to server:/192.168.1.109:9000。已尝试0次(s).

11/12/07 20:37:26 INFO ipc。Client: Retrying connect to server:/192.168.1.109:9000。已尝试1次(s).

11/12/07 20:37:28 INFO ipc。Client: Retrying connect to server:/192.168.1.109:9000。已尝试2次

11/12/07 20:37:30 INFO ipc。Client: Retrying connect to server:/192.168.1.109:9000。已尝试3次

11/12/07 20:37:32 INFO ipc。Client: Retrying connect to server:/192.168.1.109:9000。已尝试4次

11/12/07 20:37:33 INFO ipc。Client: Retrying connect to server:/192.168.1.109:9000。已尝试5次

11/12/07 20:37:35 INFO ipc。Client: Retrying connect to server:/192.168.1.109:9000。已尝试6次

11/12/07 20:37:37 INFO ipc。Client: Retrying connect to server:/192.168.1.109:9000。已经尝试7次了

11/12/07 20:37:39 INFO ipc。Client: Retrying connect to server:/192.168.1.109:9000。已尝试8次

11/12/07 20:37:41 INFO ipc。Client: Retrying connect to server:/192.168.1.109:9000。已尝试9次

java.net.ConnectException: Call to/192.168.1.109:9000 failed on connection exception: java.net.ConnectException: connection refused: no further information

为了确保套接字是否已经打开并等待hadoop服务器上的传入连接,我在ubuntu机器上进行netstat结果如下:

tcp 0 0 localhost:51201:LISTEN 2765/java
tcp 00 *:50020:LISTEN 2473/java
tcp 00 localhost:9000:LISTEN 2361/java
tcp 00 localhost:9001:LISTEN 2655/java
tcp 0 0 *:mysql:LISTEN -
tcp 00 *:50090:LISTEN 2588/java
tcp 0 0 *:11211:LISTEN -
tcp 0 0 *:40843:LISTEN 2473/java
tcp 0 0 *:58699:LISTEN -
tcp 00 *:50060:LISTEN 2765/java
tcp 00 *:50030:LISTEN 2655/java
tcp 0 0 *:53966:LISTEN 2655/java
tcp 0 0 *:www:LISTEN -
tcp 0 0 0 *:epmd:LISTEN -
tcp 0 0 *:55826:LISTEN 2588/java
tcp 0 0 *:ftp:LISTEN -
tcp 00 *:50070:LISTEN 2361/java
tcp 0 0 *:52822:LISTEN 2361/java
tcp 0 0 *:ssh:LISTEN -
tcp 0 0 *:55672:LISTEN -
tcp 00 *:50010:LISTEN 2473/java
tcp 00 *:50075:LISTEN 2473/java

我注意到,如果本地地址列类似于localhost:9000(以localhost:而不是*:开头)在某些情况下,它将无法从远程主机甚至在它自己的盒子中连接。我尝试telnet localhost 9000,它工作,我的意思是它可以连接到端口,但如果我使用telnet 192.168.1.109 9000错误显示如下

$ telnet 192.168.1.109 9000尝试192.168.1.109……telnet:无法连接到远程主机:Connection refused

我花了将近一个星期的时间来解决这个问题,我现在真的很累,我希望有人能帮助我。

注意:我不确定namenode是否默认拒绝远程连接。我是否需要更改一些设置以使其允许远程连接吗?

将客户端和NameNode的core-site.xml中"fs.default.name"的值由"hdfs://localhost:9000"改为"hdfs://106.77.211.187:9000"。请将IP地址替换为NameNode所在节点的IP地址或主机名

能够telnet 106.77.211.187 9000,这是netstat -a | grep 9000的输出

tcp6 00 106.77.211.187:9000 [::]:* LISTEN
tcp6 00 106.77.211.187:50753 106.77.211.187%819:9000 ESTABLISHED
tcp6 00 106.77.211.187:9000 106.77.211.187%81:50753 ESTABLISHED

至于为什么,将fs.default.name设置为localhost的源代码如下所示
socket.bind(localhost);

因为绑定地址是分配给本地主机的,所以namenode进程只能接受来自本地主机的连接。如果将绑定地址分配给机器名或ip地址,则namenode进程可以接受来自远程机器的任何连接。

我用所有配置文件中的ip地址替换了所有localhost,现在它工作正常。

检查/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行,这肯定是错误的。

我遇到了同样的问题,但通过以下操作可以解决这个问题。我有hadoop主节点和从节点作为CentOS7 VirtualBox虚拟机,我无法通过使用主节点的IP地址和端口从windows主机访问web gui。请确保按照下面给出的步骤进行修复;

  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. 并且在所有hadoop xml文件中使用完全限定的主机名或ip而不是localhost,正如其他人提到的

  2. 将以下条目添加到hdfs-site.xml使web gui端口从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使资源管理器web gui端口从ip而不是从0.0.0.0:8088
  2. 运行
<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并确保web端口基于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

现在您应该能够通过web浏览器从windows主机访问。我在windows hosts文件中添加了条目,所以下面的内容也能正常工作

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

希望有帮助

最新更新