一、背景
今天给客户的阿里云平台搭建Hadoop HA集群时,出现以下情况:
- 通过
hdfs haadmin -getServiceState nn1
和hdfs haadmin -getServiceState nn2
命令查看,发现两个NameNode的状态都是standby - 通过
hdfs dfsadmin -report
命令查看,发现HDFS数据均为0
- 查看日志发现:
org.apache.hadoop.ipc.RemoteException(java.io.IOException): File /home/input/file1.txt._COPYING_ could only be replicated to 0 nodes instead of minReplication (=1). There are 2 datanode(s) running and no node(s) are excluded in this operation.
二、错误原因
当首次执行命令
hadoop namenode -format
格式化NameNode时,会在dfs.namenode.name.dir
对应路径下生成current/VERSION文件,其中记录了clusterID,同时dfs.datanode.data.dir
对应的DataNode目录中也会生成current/VERSION文件,其中clustreID的与NameNode中clusterID的值相同。
当再次执行hadoop namenode -format
命令时,NameNode对应的目录下会重新生成clusterID,导致和DataNode对应的clusterID不一致,从而造成上述问题。
三、解决方案
方案一:
- 关掉集群
./stop-dfs.sh
- 删掉各个节点上DataNode对应的目录
rm -rf data
- 格式化NameNode
hadoop namenode -format
- 重启集群
./start-dfs.sh
方案二:
- 关掉集群
./stop-dfs.sh
- 编辑clusterID使Namenode和DataNode同步
vim clusterID
- 重启集群
./start-dfs.sh
注意:
在生产环境中,谨慎使用hadoop namenode -format
命令。以上操作是在首次搭建集群且没有重要数据的情况下执行的。