1. 程式人生 > >hadoop問題之java.net.NoRouteToHostException: 沒有到主機的路由

hadoop問題之java.net.NoRouteToHostException: 沒有到主機的路由

org.apache.hadoop.hdfs.server.datanode.DataNode: java.io.IOException: Call to master/192.168.198.20:9000 failed on local exception: java.net.NoRouteToHostException: 沒有到主機的路由
at org.apache.hadoop.ipc.Client.wrapException(Client.java:1150)
at org.apache.hadoop.ipc.Client.call(Client.java:1118)
at org.apache.hadoop.ipc.RPC$Invoker.invoke(RPC.java:229)
at com.sun.proxy.$Proxy3.getProtocolVersion(Unknown Source)
at org.apache.hadoop.ipc.RPC.checkVersion(RPC.java:422)
at org.apache.hadoop.ipc.RPC.getProxy(RPC.java:414)
at org.apache.hadoop.ipc.RPC.getProxy(RPC.java:392)
at org.apache.hadoop.ipc.RPC.getProxy(RPC.java:374)
at org.apache.hadoop.ipc.RPC.getProxy(RPC.java:453)
at org.apache.hadoop.ipc.RPC.waitForProxy(RPC.java:335)
at org.apache.hadoop.ipc.RPC.waitForProxy(RPC.java:300)
at org.apache.hadoop.hdfs.server.datanode.DataNode.startDataNode(DataNode.java:385)
at org.apache.hadoop.hdfs.server.datanode.DataNode.<init>(DataNode.java:321)
at org.apache.hadoop.hdfs.server.datanode.DataNode.makeInstance(DataNode.java:1712)
at org.apache.hadoop.hdfs.server.datanode.DataNode.instantiateDataNode(DataNode.java:1651)
at org.apache.hadoop.hdfs.server.datanode.DataNode.createDataNode(DataNode.java:1669)
at org.apache.hadoop.hdfs.server.datanode.DataNode.secureMain(DataNode.java:1795)
at org.apache.hadoop.hdfs.server.datanode.DataNode.main(DataNode.java:1812)
Caused by: java.net.NoRouteToHostException: 沒有到主機的路由
at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method)

 

問題分析:

這種沒有到主機的路由問題屢見不鮮了,一般要麼是namenode 與 datanode 主機名間本身互ping就ping不通,這個概率較小,因為都知道要保證master與slaves 節點是能正常通訊,所以都會檢查。那麼最有可能就是防火牆沒有關閉,或者因為查看不出防火牆狀態,所以誤以為防火牆關閉了。


解決方案:
(1)從namenode主機ping其它slaves節點的主機名(注意是slaves節點的主機名),如果ping不通,原因可能是namenode節點的/etc/hosts 未配置主機名與IP地址的對映關係,補全主機名與IP地址的對映關係。


(2)從datanode主機ping master節點的主機名(注意也是節點的主機名),如果ping不通,原因可能是datenode節點的/etc/hosts 未配置主機名與IP地址的對映關係,補全主機名與IP地址的對映關係。


(3)檢視各機器節點的防火牆是否關閉(或者設定防火牆開啟,但對我們的指定埠開放,最好是關閉防火牆):

以下針對不同版本的Linux系統檢查防火牆的狀態,及關閉防火牆:

------------------------------------------------------------------------------------------------------------------------------------------

Ubuntu(ubuntu-12.04-desktop-amd64)

檢視防火牆狀態:ufw status

關閉防火牆:ufw disable

------------------------------------------------------------------------------------------------------------------------------------------
centos6.0

檢視防火牆狀態:service iptables status

關閉防火牆:chkconfig iptables off    #開機不啟動防火牆服務

------------------------------------------------------------------------------------------------------------------------------------------

centos7.0(預設是使用firewall作為防火牆,如若未改為iptables防火牆,使用以下命令檢視和關閉防火牆)

檢視防火牆狀態:firewall-cmd --state

關閉防火牆:systemctl s