最近在做Hadoop实验。根据错误提示发现是datanode通过ipc连接不上namenode。
最后查看hadoop源码,发现是socket通信问题。网上看过很多资料,也请教了很
多人,但是没有人有类似经验,一直解决不了,现在问题解决了,权且做个记录,
方便以后的朋友。
问题:
实验环境:
宿主机均是i7处理器(8核/16G)
虚拟机(客户机)均是VmWare workstation 8 中打开
宿主机1:
OS:win7
IP 192.168.0.47
宿主机1上虚拟机(fedora15):
datanode007:IP 192.168.0.207(bridge)
datanode008:IP 192.168.0.208(bridge)
datanode009:IP 192.168.0.209(bridge)
datanode010:IP 192.168.0.210(bridge)
datanode011:IP 192.168.0.211(bridge)
datanode012:IP 192.168.0.212(bridge)
宿主机2:
OS:win7
IP 192.168.0.48
宿主机2上虚拟机(fedora15):
namenode:IP 192.168.0.200(bridge)
datanode001:IP 192.168.0.201(bridge)
datanode002:IP 192.168.0.202(bridge)
datanode003:IP 192.168.0.203(bridge)
宿主机3:
OS:win7
IP 192.168.0.49
宿主机3上虚拟机(fedora15):
datanode004:IP 192.168.0.204(bridge)
datanode005:IP 192.168.0.205(bridge)
datanode006:IP 192.168.0.206(bridge)
症状:
1,宿主机1~3及namenode/datanode001~012两两之间都能ping通,
2,namenode/datanode001~012两两之间都能通过ssh远程登入。
3,在宿主机1上的客户机datanode007~012之间socket通信正常,通过socket程序
(sever.c/client.c)测试验证过.
4,在宿主机2上的客户机namenode/datanode001~003之间socket通信正常,通过socket程序
(sever.c/client.c)测试验证过.hadoop启动成功信息也正常,livenodes为4(namenode也
设置为slave,如果不设置,则为3)
5,在宿主机3上的客户机datanode004~005之间socket通信正常,通过socket程序
(sever.c/client.c)测试验证过.
6,在宿主机1上的客户机datanode007~012任一与宿主机2上的客户机namenode/datanode001~003
任一之间socket通信异常,通过socket程序(sever.c/client.c)测试验证失败.
7,任一两个datanode移到同一宿主机,socket通信恢复正常.
测试条件客户机防火墙关闭,宿主机/客户机都设置不代理联网,结果均相同。
实在想不出还有什么问题了。
提示:
1,各个客户机ping自己耗时0.016ms左右(直接)
2,同一宿主机内客户机两两互ping耗时0.17ms左右(直接)
3,跨宿主机之间客户机两两互ping耗时1.8ms左右(报文通过宿主机IP中转)
4,个人觉得VmWare workstation 8在bridge联网模式下并非直接联网,通过禁用
宿主机本地网卡验证过。如,禁止宿主机2本地网卡后,namenode/datanode001~003
之间两两还是能够互ping,但是显然不能ping同宿主机2,且也不能ping通其它宿主机
及任一其它宿主机上的客户机。
问题解决了,是宿主机windows防火墙和杀毒软件开着的缘故,两个都需要设置才行。
解决方案:关闭windows防火墙(如果集群是内网,那么可以选择关闭内网防火墙;如果是域用户的话,那么
还需要关闭域用户防火墙)
关闭杀毒软件(可以单独关闭网络过滤那一栏,如果
有时间可以自己测试添加socket通信端口至非过滤列表)
以上两个要同时设定,否则还是被过滤的。
问题:为什么防火墙不关闭时,ssh通信完全正常,但是socket通信异常。