一切来源于罪恶的报错:
java.io.IOException: Got error, status=ERROR, status message , ack with firstBadLink as ip:端口
心急的直接跳到文章最后
一直是照着尚硅谷的教程学的,一步步配置。奈何电脑太差,只有4核4线程,16G内存,开三台1核1线程的虚拟机简直要命。就租了三台云服务器,买云服务几百块,总比买台新电脑大几千来的划算。起初,服务器配置如下:
vim /etc/hosts
是不是网上一大堆说这么配的
本机内网IP 本机名 本机名
外机外网IP 外机名1 外机名1
外机外网IP 外机名2 外机名2
得,我也这么配。照着配完一系列配置文件,跑一个示例程序wordcount。发现卡在map 0%, reduce 0%半天,要么map 100% reduce 0%,要么map 100% reduce 100%半天。偶尔运气好跑完了,结果要十几分钟。一看logs,发现写着
java.io.IOException: Got error, status=ERROR, status message , ack with firstBadLink as ip:端口
看网上,都是说什么防火墙没关。看到一堆博客下面评论,说防火墙关了还是报错,但是没人回复过。
查防火墙
systemctl status firewalld
not running
确实关了呀,ping也通,telnet也通。我是报的9866端口错,一看云服务器安全组,端口都下放了,telnet IP 9866也没问题。于是开始怀疑hadoop100是轻量应用型服务器的缘故,网卡不好,于是又租了台 腾讯云服务器,2核2G作为新的hadoop100.
配置完,发现wordcount能跑了,虽然要个几十秒—小四五分钟不等,大多时候好,少数时候坏,安慰说服自己ta已经好了。
于是继续学习
等学到了hive,建完表,一个insert into stu values(1, "yellow");
绷不住了,一直卡在map 0% reduce 0%。logs又出现了 java.io.IOException: Got error, status=ERROR, status message , ack with firstBadLink as ip:端口
。
找某50元调集群,运气好第一次运行出来了,和我说好了。一跑hive,炸了,他说整不出来,机器问题。我干脆直接找腾讯云售后工程师,捣鼓半天不知道哪儿毛病。又找了阿里云售后工程师,捣鼓半天也不知道哪儿毛病。
后来我一想,人家集群的服务器都是直接内网通讯的,那我要是也换内网呢?刚好有三台腾讯云的服务器,买的时候留了个心眼,都买的是地域广州的。
上官网一查,确实有这操作,轻量应用型服务器可以通过“云联网”和云服务器相连。
于是一波捣鼓,重新配置三台服务器的 /etc/hosts
内网IP1 主机名1 主机名1
内网IP2 主机名2 主机名2
内网IP3 主机名3 主机名3
发现ssh 主机名
可以连接到别的机子
重新配置ssh无密连接
删除旧的keys:
rm -rf /home/用户名/.ssh
配置新keys:
ssh-keygen -t rsa
ssh-copy-id hadoop10x
然后重置hadoop集群,进入 cd $HADOOP_HOME
删除集群上所有机器上hadoop的 data logs
rm -rf data/ logs/
初始化namenode
hdfs namenode -format
然后启动集群,发现wordcount只需要短短几秒就能跑完。配置hive mysql,发现insert也变得无比丝滑。无一例外。
因此,最终的解决方案就是:
将集群上的云服务器内网互联
那些博客说配内网IP,外网IP的,我想知道你们的集群真的能正常运作嘛?当然也有可能是我菜。
如果读者有遇到配置过程中的其他问题,可以留言问我,没准我也遇到过。