问题:
将文件上载到HDFS时,可能会遇到以下异常。
抛出的异常:
File /hdfsapi/test/a.txt could only be replicated to 0 nodes instead of minReplication (=1).
翻译:
线程“main”中的异常org.apache.hadoop.ipc.RemoteException(java.io.IOException):文件/test222.xml只能复制到0个节点而不是minReplication(= 1)。运行中有1个数据节点,此操作中排除了1个节点。
原因:
如果您确定数据节点的容量没有用尽并且主节点和数据节点之间的通信运行良好,那么问题可能是由URL解析引起的。具体来说,HDFS客户端无法连接到datanode,尽管它可以与主节点连接。
解决办法:
1.在org.apache.hadoop.conf.Configuration实例上添加以下配置:
Configuration conf = new Configuration();
conf.set("dfs.client.use.datanode.hostname", "true");
2.确认您的客户端可以ping datanode
例如datanode主机名:hadoopnode1
如果ping失败,则手动添加解析映射。
1)在Mac OS中,使用以下命令编辑主机文件。
sudo vi /private/etc/hosts
2)将以下映射添加到文件中。
ip(公网IP) hadoopnode1
然后,再次尝试您的程序。问题应该消失了。
说明:
节点对应配置的IP的是内网服务器IP。而访问的过程中,我们采用的是公网服务器IP进行访问。
所以当datanode 向namenode 注册的是内网的IP时。
而我们走公网ip 访问namenode 的时候,可以访问到namenode,并且可以得到相应的datanode 的注册信息。于是通过对应的注册信息进行访问,但是此时datanode 向namenode 注册的是内网的IP,因为远程访问的客户端机器和hdfs系统所在的机器不在一个内网集群 ,所以会导致虽然有一个datanode 但是没有可用节点,因为公网访问不到私网。
解决方法在远程调用的相应的配置中加入configuration.set(“dfs.client.use.datanode.hostname”,“true”);
使用hostname 进行访问同时在hosts 文件中配置对应的主机名和公网ip 的映射,即可远程成功调用hdfs