通过 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 端口只有虚拟机可以访问
解决方法其实解决方法已经很明显,只要让 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 测试本地主机是否能和虚拟机通信



