关于 Hadoop集群的java.net.NoRouteToHostException: 没有到主机的路由异常的问题
关于 Hadoop集群的java.net.NoRouteToHostException: 没有到主机的路由异常的问题
前段天对电脑加装了固态,重装了系统以前虚拟机的Hadoop集群也因此没了,所以重新做了个集群,由于临近期末忙于复习就没有测试集群是否能用,就在昨天跑了一下以前的程序结果出现了下面的异常,忙了一晚上才发现就只是Linux防火墙没关造成的,总结一下这个问题的解决方式。
首先呢,要明确这个问题产生的原因:
java.net.NoRouteToHostException意思是当前主机与其他节点无法建立RPC通信,RPC通信基于Socket封装,socket实质就是 IP地址 + 目的端口。
明确这两点我们就可以分步检查了
第一步:
先对IP地址进行检查,检查网络是否畅通(各节点在同一个VLAN下是不用检查的),检查hosts文件对应关系是否正确。
首先ping 百度,或者使用ip ping其它节点 ,若能ping通则证明网络是没问题的,如若不能则需要检查网络(如当前ip是否有效,网关是否设置正确等)问题。
以ping 百度为例:
[[email protected] ~]$ ping www.baidu.com
PING www.a.shifen.com (111.13.100.92) 56(84) bytes of data.
64 bytes from 111.13.100.92 (111.13.100.92): icmp_seq=1 ttl=128 time=23.0 ms
64 bytes from 111.13.100.92 (111.13.100.92): icmp_seq=2 ttl=128 time=20.7 ms
64 bytes from 111.13.100.92 (111.13.100.92): icmp_seq=3 ttl=128 time=21.4 ms
64 bytes from 111.13.100.92 (111.13.100.92): icmp_seq=4 ttl=128 time=20.3 ms
^Z
1+ 已停止 ping www.baidu.com
检查到没有网络问题后,我们检查主机表(hosts文件)对应,检查不用去挨个查看,直接在各节点上使用主机名互ping
[[email protected] ~]$ ping node01
PING node01 (192.168.38.3) 56(84) bytes of data.
64 bytes from node01 (192.168.38.3): icmp_seq=1 ttl=64 time=0.642 ms
64 bytes from node01 (192.168.38.3): icmp_seq=2 ttl=64 time=0.661 ms
64 bytes from node01 (192.168.38.3): icmp_seq=3 ttl=64 time=0.602 ms
64 bytes from node01 (192.168.38.3): icmp_seq=4 ttl=64 time=0.660 ms
^Z
1+ 已停止 ping node01
[[email protected] ~]$ ping node02
PING node02 (192.168.38.4) 56(84) bytes of data.
64 bytes from node02 (192.168.38.4): icmp_seq=1 ttl=64 time=1.01 ms
64 bytes from node02 (192.168.38.4): icmp_seq=2 ttl=64 time=0.579 ms
64 bytes from node02 (192.168.38.4): icmp_seq=3 ttl=64 time=0.551 ms
^Z
2+ 已停止 ping node02
都能ping通在证明主机对应无误。
若存在
[[email protected] ~]$ ping node01
ping: node01: 未知的名称或服务
是因为该节点主机对应有误。
进入/etc/hosts文件修改即可
[[email protected] ~]$ sudo vim /etc/hosts
[sudo] peng 的密码:
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.38.3 node01
192.168.38.4 node02
192.168.38.5 node03
注意:node01,node02,node03后面不能有除换行符外的空白符,如空格和制表符,系统会把他们当做主机名的一部分。
第二步:
查看防火墙是否关闭,端口问题是由防火墙拒绝服务造成的。
centOS 6使用的是iptables,centOS 7使用的是firewalld两者关闭的命令不同
centOS 6 :
[[email protected] ~]$ sudo service iptables stop //关闭防火墙
[sudo] password for peng:
[[email protected] ~]$ sudo service iptables status //查看当前防火墙的状态
iptables: Firewall is not running.
[[email protected] ~]$ sudo chkconfig iptables off //关闭防火墙开机自启动
centOS 7:
[[email protected] sbin]$ sudo systemctl stop firewalld //关闭防火墙
[sudo] peng 的密码:
[[email protected] sbin]$ sudo systemctl status firewalld //查看当前防火墙的状态
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
Active: inactive (dead) since 二 2019-01-08 16:17:57 CST; 24s ago
Docs: man:firewalld(1)
Process: 8739 ExecStart=/usr/sbin/firewalld --nofork --nopid $FIREWALLD_ARGS (code=exited, status=0/SUCCESS)
Main PID: 8739 (code=exited, status=0/SUCCESS)
1月 08 15:15:26 node01 systemd1: Starting firewalld - dynamic firewall daemon…
1月 08 15:15:28 node01 systemd1: Started firewalld - dynamic firewall daemon.
1月 08 16:17:56 node01 systemd1: Stopping firewalld - dynamic firewall daemon…
1月 08 16:17:57 node01 systemd1: Stopped firewalld - dynamic firewall daemon.
[[email protected] sbin]$ sudo systemctl disable firewalld // 关闭防火墙开机自启动
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
如果centOS 7 使用yum安装了iptables要使用对应的关闭方式。
至此,Hadoop集群的java.net.NoRouteToHostException问题便解决了。