前提:本书中教程是在本地安装虚拟机,虚拟机装图形化界面的CentOS7,并且安装在虚拟机上安装Hadoop 3.0.0。并且在Linux系统中安装Eclipse使用java调用Hadoop的api教程。但是本人不喜欢在本地安装虚拟机和Eclipse,所以我是用的是腾讯云服务器安装CentOS7系统,本地Win环境安装IDEA跟随书籍指导来实现。由于与书籍环境太一致,导致踩了很多的坑,在此记录下来,为自己或其他像我一样本地连接远程Hadoop的小伙伴提供踩坑的问题和解决方法。
书籍:《大数据Hadoop 3.x分布式处理实战》 人民邮电出版社版
问题1 3.3.3 HDFS Java API实例
在本章中,书中使用了java API对hadoop的文件进行操作,我也在本地的IDEA环境写了下书上的代码,遇到几个问题。一个是书上的java代码和hadoop是在同一个环境中,因此他的java代码中Hadoop的uri用的是“hdfs://hadoop0:9000/”,我连的是服务器上的hadoop,因此我的hadoop0需要更换为服务器的公网ip,并且在对应的云平台上将服务器的9000端口开放。
开放了端口,使用书籍上的代码,向服务器写文件调试的时候报错
java.io.FileNotFoundException: java.io.FileNotFoundException: HADOOP_HOME and hadoop.home.dir are unset. -see https://wiki.apache.org/hadoop/WindowsProblems
这是需要win环境下载以hadoop的配置,可以下载和配置方法请参考这个博客。
https://blog.csdn.net/weixin_38504735/article/details/125216888
连接好了之后,开始上传文件测试,输上了书上的上传代码,又遇到一个问题
hadoop中只是创建了文件,但是只是一个空的文件,里边并没有我想写入的“hello world”
这个问题是因为:
NameNode节点存放的是文件目录,也就是文件夹、文件名称,本地可以通过公网访问 NameNode,所以可以进行文件夹的创建,当上传文件需要写入数据到DataNode时,NameNode 和DataNode 是通过局域网进行通信,NameNode返回地址为 DataNode 的私有 IP,本地无法访问。因此需要配置主机名和公网ip的映射关系来对DataNode可以进行写入。
在此提供更改代码的方式解决这个问题
public static FileSystem getFileSystem() throws Exception {
URI uri = new URI("hdfs://xxx:9000/");// xxx你的公网ip
Configuration configuration = new Configuration();
// 需要加上下方两句配置
configuration.set("dfs.client.use.datanode.hostname", "true");
FileSystem fileSystem = FileSystem.get(uri, configuration, "root");
return fileSystem;
}
然后本地配置一下DNS域名映射。首先查看linux主机名称,我们可以通过下面的命令查看:
hadoop dfsadmin -report
然后在C:\Windows\System32\drivers\etc的hosts文件中新增一个你服务器公网ip到主机名的映射
云服务器还需要配置一下安全组,对外开放 9866端口,然后就可以重新执行上传文件的程序了。
附修改host文件的方法:https://baijiahao.baidu.com/s?id=1717567112868968220&wfr=spider&for=pc