5

我在一台 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是否默认拒绝远程连接。我是否需要更改一些设置才能允许远程连接?

4

4 回答 4

9

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

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

TCP6 0 0 106.77.211.187:9000 [::]:*
收听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进程只能接受来自本地主机的连接。如果绑定地址被分配给机器名或ip地址的名称,那么namenode进程可以接受来自远程机器的任何连接。

于 2012-01-01T17:32:44.677 回答
3

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

于 2012-11-05T05:44:37.497 回答
0

检查 /etc/hosts文件并确保您拥有与节点的完全限定名称 (FQN) 关联的 IP。例子:

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绝对是错误的。

于 2018-01-17T08:45:09.000 回答
0

我遇到了同样的问题,但能够通过执行以下操作来解决它。我将 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
<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 主机文件中,因此即使以下内容也有效

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

希望这可以帮助

于 2019-04-25T13:20:05.733 回答