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

时间:2012-01-01 15:10:42

标签: java ubuntu hadoop hdfs netstat

我在一台IP为192.168.1.109的计算机上成功安装并运行Hadoop(事实上它实际上是在虚拟机上运行的Ubuntu实例)。 输入jps时显示

2473 DataNode

2765 TaskTracker

3373 Jps

2361 NameNode

2588 SecondaryNameNode

2655 JobTracker

这应该意味着hadoop启动并运行。 像./hadoop fs -ls这样的运行命令很好,可以产生预期的结果。

但是,如果我尝试通过写入从我的IP为192.168.1.80的Windows框连接它 Java代码的HDFS API连接如下:

配置conf =新配置();

FileSystem hdfs = null;

路径filenamePath =新路径(FILE_NAME);

hdfs = FileSystem.get(conf); < - 此行发生的问题

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

11/12/07 20:37:24 INFO ipc.Client:重试连接服务器:/192.168.1.109:9000。已经尝试了0次。

11/12/07 20:37:26 INFO ipc.Client:重试连接服务器:/192.168.1.109:9000。已经尝试了1次。

11/12/07 20:37:28 INFO ipc.Client:重试连接服务器:/192.168.1.109:9000。已经尝试了2次。

11/12/07 20:37:30 INFO ipc.Client:重试连接服务器:/192.168.1.109:9000。已经尝试了3次。

11/12/07 20:37:32 INFO ipc.Client:重试连接服务器:/192.168.1.109:9000。已经尝试了4次。

11/12/07 20:37:33 INFO ipc.Client:重试连接服务器:/192.168.1.109:9000。已经尝试了5次。

11/12/07 20:37:35 INFO ipc.Client:重试连接服务器:/192.168.1.109:9000。已经尝试了6次。

11/12/07 20:37:37 INFO ipc.Client:重试连接服务器:/192.168.1.109:9000。已经尝试了7次。

11/12/07 20:37:39 INFO ipc.Client:重试连接服务器:/192.168.1.109:9000。已经尝试了8次。

11/12/07 20:37:41 INFO ipc.Client:重试连接服务器:/192.168.1.109:9000。已经尝试了9次。

java.net.ConnectException:在连接异常时调用/192.168.1.109:9000失败:java.net.ConnectException:连接被拒绝:没有进一步的信息

要确定套接字是否已经打开并等待hadoop服务器上的传入连接,我在ubuntu框上netstat 结果如下:

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

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

$ telnet 192.168.1.109 9000 试试192.168.1.109 ...... telnet:无法连接到远程主机:拒绝连接

我花了将近一周的时间来搞清楚我现在真的很累的问题,希望有人能帮助我。

注意:我不确定namenode是否默认拒绝远程连接。我是否需要更改某些设置才能允许 远程连接?

4 个答案:

答案 0 :(得分:8)

将core-site.xml中的fs.default.name的值hdfs://106.77.211.187:9000更改为hdfs://localhost:9000,以用于客户端和NameNode。将IP地址替换为运行NameNode的节点的IP地址或主机名。

能够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 ESTABLISHED

至于为什么,fs.default.name设置为localhost的源代码如下所示

  

ServerSocket socket = new ServerSocket(9000);
  socket.bind(本地主机);

由于绑定地址已分配给localhost,因此namenode进程只能接受来自localhost的连接。如果将绑定地址分配给计算机名称或IP地址的名称,则namenode进程可以接受来自远程计算机的任何连接。

答案 1 :(得分:3)

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

答案 2 :(得分:0)

检查/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确实是错误的。

答案 3 :(得分:0)

我遇到了同样的问题,但是通过执行以下操作可以解决此问题。我拥有hadoop的主服务器和从属服务器作为CentOS7 VirtualBox VM,并且无法使用主节点的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

  3. 运行
<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来运行
<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

现在,您应该能够通过网络浏览器从Windows主机进行访问。我已将条目添加到Windows主机文件中,因此即使以下操作也可以

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

希望这会有所帮助