通过 Hadoop 本机编程中关于虚拟机和本地主机通信的知识点
起因本地主机编写相应的代码后运行发现报错,java.net.ConnectException: Call From LAPTOP-LJF22VB3/192.168.56.1 to 192.168,这是因为 Hadoop core-site.xml 其中的 fs.defaultFS 设置为 hdfs://localhost:9000,fs.defaultFS 配置错误,这是导致本机不能访问 Hadoop 9000 端口的根本原因
原因上面将了根本原因,是因为 fs.defaultFS 配置为 localhost(127.0.0.1),这导致虚拟机上的 9000 端口只能由虚拟机访问,而本机在 IDEA 上调用时无法访问虚拟机的该端口,即使虚拟机的 ip 和本地主机是同一网段
此时本地主机是 192.168.43.1,而虚拟机的 ip 是 192.168.43.18,两台机子是同一网段
通过 netstat -tupnl 命令可以查看端口使用详情,下面有一张 Hadoop 运行时的网络图片
由上图可以看见 9000 端口只有虚拟机可以访问
另一种情况虚拟机 IP 和本机处在同一网段但是仍然 Ping 不通
后面使用的时候又遇到连不上的情况,但是原因不同
注意看上图的 VMnet8,这是 VM 创建的虚拟网卡,Nat 模式下 VMnet8 的 IPV4 地址必须和虚拟机的 ip 在同一个网段(ifconfig 可以查看 ip),这里为了简便我把电脑 VMnet 8 的网段设置为静态的,默认就是 192.168.43.1,子网掩码是 255.255.255.0,这里虚拟机里的 IP 只要前三个数字一样就是同一网段(子网掩码和 IP 通过计算得出的,可以自己百度),具体设置如下(理论上来说 VM 里面也是可以配的)
注意,我这里 VMnet8 已经和虚拟机处在同一网段,都是 192.168.43,但是仍然无法通信,这里具体原因不知道是什么,但是解决方法还是有点,比较麻烦,在下面有讲
解决方法其实解决方法已经很明显,只要让 9000 端口能让本地主机访问就行了,所以解决方法有两个
- core-site.xml,直接配置你当前的 IP,不放过需要注意的是你这个 IP 不能经常变,本地主机一旦换了个网络,IP 就会随机分配一个,所以这个方案,只适用与网络固定的时候,比如你的本地主机只用一条网线或者一台路由器
- /etc/hosts 修改,core-site.xml 设置一个你中意的名字,比如 hadoop01,然后在 hosts 文件中添加映射,也就是路由表中添加映射(涉及到一点点计网知识),这样 hadoop 在启动时就会去路由表里面找,并映射相应的 IP,这个时候你换个网络的时候修改一下 hosts 文件就又能访问到虚拟机里面的 9000 端口,正常的在本机进行 Hadoop 编程,core-site.xml 只需要配置一次,不需要再去修改 core-site.xml,并且重新启用,这个方法适合笔记本电脑,连 WIFI、热点这种
第一种方法,解决方案
hadoop.tmp.dir file:/usr/local/hadoop/tmp Abase for other temporary directories. fs.defaultFS hdfs://192.168.43.18:9000
第二种方法,解决方法
hadoop.tmp.dir file:/usr/local/hadoop/tmp Abase for other temporary directories. fs.defaultFS hdfs://hadoop01:9000
vi /etc/hosts 192.168.43.18 hadoop01 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost4 localhost4.localdomain4
可以使用 curl 192.168.43.18:9000 或者 telnet 192.168.43.18 9000 测试本地主机是否能和虚拟机通信
另一种情况的解决方法我使用的 VM
- VMware® Workstation 15 Pro
- 15.5.0 build-14665864
进到 VM -> 编辑 -> 虚拟网络编辑器 -> 更改设置 -> 还原默认设置
注意到还原默认设置的那一步,你的虚拟机 IP 会被重新随机分配一个 IP,记住这个 IP,待会需要改回来(不然需要重新配置 Hadoop 很麻烦)
改回来 IP 后重新 Ping 一下,说不定就能成功
终极解决方法在尝试了上面的所有方法后,我的电脑每次重启后,再次连接虚拟机总是无法成功,无法 ping 通,但虚拟机 ping 本地主机是没有问题的,最后偶然间看到另一个博主的方法,比还原默认设置要更加快(还原默认设置至少需要3-5分钟),而这个博主的方法只需要 1 分钟左右,该博主的文章-主机重启后,主机无法PING通VMware的虚拟机,虚拟机可以PING通主机(妥协解决方案)
他的解决方案是禁用 VMnet8 然后再启用 VMnet8(就这么简单,但有用,而且虚拟机都不用重启)
总结后面又更新了好几次,每次遇到新的问题找到新的解决方法又会更新,后面的更新和 HDFS 本地编程 看起来没什么关系了,但问题的本质是一样的(其实后面两个的解决方法的原理和原因我已经不知道了)



