在Hadoop上传文件时出现报错
could only be written to 0 of the 1 minReplication nodes. There are 1 datanode(s) running and 1 node(s) are excluded in this operation.
打开后DEBUG日志后,查看到提示
Not enough replicas was chosen. Reason: {NO_REQUIRED_STORAGE_TYPE=1}
Choosing random from 0 available nodes on node /, scope=, excludedScope=null, excludeNodes=[172.17.0.5:2270]. numOfDatanodes=1
Datanode None is not chosen since required storage types are unavailable for storage type DISK.
通过根据Hadoop源代码,可以看到org.apache.hadoop.hdfs.DataStreamer这个类里面记录了排除的节点,在上传文件时导致无可用的datanode而无法上传。而以下几种情况都会导致datanode被排除:
- 权限不足
在客户端请求hadoop时,默认会以当前操作系统作为用户名进行请求。hadoop会根据用户名和group进行匹配,如果权限不足会导致datanode被排除。解决方案在代码内设置系统用户名为“root”即可,root默认拥有权限组。
System.setProperty("HADOOP_USER_NAME","root");
-
网络不通
在上传文件的过程中,hadoop服务端会返回datanode地址给客户端,客户端需要连接到datanode进行上传,如果无法访问也会导致该datanode被排除。 -
磁盘策略
当我们往 HDFS 上写入新的数据块,DataNode 将会使用 volume 选择策略来为这个块选择存储的地方。
通过参数 dfs.datanode.fsdataset.volume.choosing.policy 来设置.
这个参数目前支持两种磁盘选择策略。
org.apache.hadoop.hdfs.server.datanode.fsdataset.RoundRobinVolumeChoosingPolicy org.apache.hadoop.hdfs.server.datanode.fsdataset.AvailableSpaceVolumeChoosingPolicy
第一种为集群默认的卷轮询方式,实现类:RoundRobinVolumeChoosingPolicy.java 第二种为卷可用空间优先方式,实现类:AvailableSpaceVolumeChoosingPolicy.java