-
在阿里云服务器搭建完Hadoop环境后,在服务器上用shell命令可以读取写入文件,但是本地java程序可以连接hadoop创建路径,上传文件失败。有文件名称,内容为0。
1.既然是伪分布式集群,所以文件中的所有配置都要留内网ip,方便namenode与datanode相通信。
2.在客户端通过代码连接时,需要指定namenode通过hostname去连接datanode,按第一条来说,hostname要留内网ip。所以直接通过外网ip是没有办法连接hadoop集群的所以会导致报这种错。
/hdfsapi/test/a.txt could only be replicated to 0 nodes instead of minReplication (=1)
问题原因:
1.阿里云服务器Shell 可以正常操作,排除集群搭建和进程没有启动的问题。
2.HDFS 中的文件夹和文件名都是存放在 NameNode 上,操作不需要和 DataNode 通信,因此可以正常创建文件夹和创建文件说明本地和远程 NameNode 通信没有问题。
3.那么很可能是本地和远程 DataNode 通信有问题。
4.猜测问题原因为:文件夹和文件名都是存放在 NameNode 上的,我本地可以通过公网访问 NameNode,所以创建文件夹和文件都可以,但是当我写数据的时候,NameNode 和DataNode 是通过内网通信的,NameNode 会返回给我 DataNode 的内网 IP,我本地就访问不了了。
还有一种可能,云服务器没有开放 DataNode 用于数据传输服务端口 默认是 50010。
解决问题:
1.构造HDFS客户端的时候加如下配置,使 NameNode 返回 DataNode 的主机名而不是 IP
configuration = new Configuration();
configuration.set("dfs.client.use.datanode.hostname", "true");
- 配置 hdfs-site.xml
<property>
<name>dfs.client.use.datanode.hostname</name>
<value>true</value>
</property>
3.阿里云服务器的host配置如下:
/etc/hosts
172.xx.xx.xx master
4.阿里云服务器开放50010端口
问题解决了!!
作者:大雄的学习笔记
链接:https://www.jianshu.com/p/dd52b6d989b2
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。