wor*_*l.j 4 java ubuntu hadoop netstat hdfs
我在一台IP为192.168.1.109的计算机上成功安装并运行Hadoop(实际上它实际上是在虚拟机上运行的Ubuntu实例).键入jps时显示
2473 DataNode
2765 TaskTracker
3373 Jps
2361 NameNode
2588 SecondaryNameNode
2655 JobTracker
这应该意味着hadoop正在运行.像./hadoop fs -ls这样的运行命令很好,可以产生预期的结果.
但是,如果我尝试通过编写Java代码的HDFS API来连接它从我的IP为192.168.1.80的Windows框连接它,如下所示:
配置conf = new Configuration();
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是否默认拒绝远程连接.我是否需要更改某些设置才能允许远程连接?
变化值fs.default.name,以hdfs://106.77.211.187:9000从hdfs://localhost:9000核心-site.xml中的客户端和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 ESTABLISHED
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进程可以接受来自远程计算机的任何连接.