我在一台 ip 为 192.168.1.109 的机器上成功安装并运行了 Hadoop(实际上它实际上是一个运行在虚拟机上的 Ubuntu 实例)。输入 jps 时显示
2473 数据节点
2765 任务跟踪器
3373 日元
2361 名称节点
2588 次要名称节点
2655 工作跟踪器
这应该意味着 hadoop 已启动并正在运行。运行 ./hadoop fs -ls 之类的命令很好,并且会产生预期的结果。
但是,如果我尝试通过编写 Java 代码的 HDFS API 来连接它,方法是从 ip 为 192.168.1.80 的 windows 框连接它,如下所示:
配置 conf = new Configuration();
文件系统 hdfs = null;
路径文件名Path = new Path(FILE_NAME);
hdfs = FileSystem.get(conf); <-- 问题发生在这一行
当我运行代码时,错误显示如下:
2007 年 11 月 12 日 20:37:24 信息 ipc.Client:重试连接到服务器:/192.168.1.109:9000。已尝试 0 次。
2007 年 11 月 12 日 20:37:26 信息 ipc.Client:重试连接到服务器:/192.168.1.109:9000。已尝试 1 次。
2007 年 11 月 12 日 20:37:28 信息 ipc.Client:重试连接到服务器:/192.168.1.109:9000。已经尝试了 2 次。
2007 年 11 月 12 日 20:37:30 信息 ipc.Client:重试连接到服务器:/192.168.1.109:9000。已经尝试了 3 次。
2007 年 11 月 12 日 20:37:32 信息 ipc.Client:重试连接到服务器:/192.168.1.109:9000。已经尝试了 4 次。
2007 年 11 月 12 日 20:37:33 信息 ipc.Client:重试连接到服务器:/192.168.1.109:9000。已经尝试了 5 次。
2007 年 11 月 12 日 20:37:35 信息 ipc.Client:重试连接到服务器:/192.168.1.109:9000。已经尝试了 6 次。
2007 年 11 月 12 日 20:37:37 信息 ipc.Client:重试连接到服务器:/192.168.1.109:9000。已经尝试了 7 次。
2007 年 11 月 12 日 20:37:39 信息 ipc.Client:重试连接到服务器:/192.168.1.109:9000。已经尝试了 8 次。
2007 年 11 月 12 日 20:37:41 信息 ipc.Client:重试连接到服务器:/192.168.1.109:9000。已经尝试了 9 次。
java.net.ConnectException:调用/192.168.1.109:9000 连接异常失败:java.net.ConnectException:连接被拒绝:没有更多信息
为了确保套接字是否已经打开并等待 hadoop serer 上的传入连接,我在 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 : 听
-tcp 0 0 *:50090 : 听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 : 听 2655/java
tcp 0 0 *:www :听 -
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 :听 -tcp
0 0 *:55672 :听 -tcp
0 0 *:50010 : 听 2473/java
tcp 0 0 *:50075 :听 2473/java
我注意到,如果本地地址列类似于 localhost:9000(以 localhost: 而不是 *:) 开头,它将无法从远程主机连接,甚至在某些情况下也无法连接到它自己的盒子中。我试过 telnet localhost 9000 它可以工作,我的意思是它可以连接到端口但是如果我使用 telnet 192.168.1.109 9000 错误显示如下
$ telnet 192.168.1.109 9000 Trying 192.168.1.109... telnet:无法连接到远程主机:连接被拒绝
我花了将近一个星期的时间来解决我现在真的很累的问题,我希望有人能帮助我。
注意:我不确定namenode是否默认拒绝远程连接。我是否需要更改一些设置才能允许远程连接?