在做hadoop测试的时候,由于误操作,datanode不能启动了。查询日志也没有错误提示。我们先来看看hadoop文件的元文件目录结构
.
├── data
│?? ├── current
│?? │?? ├── BP-1808523652-192.168.237.128-1451363010425
│?? │?? │?? ├── current
│?? │?? │?? │?? ├── finalized
│?? │?? │?? │?? ├── rbw
│?? │?? │?? │?? └── VERSION
│?? │?? │?? ├── dncp_block_verification.log.curr
│?? │?? │?? └── tmp
│?? │?? └── VERSION
│?? └── in_use.lock
└── name
├── current
│?? ├── edits_inprogress_0000000000000000001
│?? ├── fsimage_0000000000000000000
│?? ├── fsimage_0000000000000000000.md5
│?? ├── seen_txid
│?? └── VERSION
└── in_use.lock
在data 和 name目录下有两个VERSION文件。
data 下的version如下
storageID=DS-33e892d0-db6c-4185-a1c2-8242a87d1f95
clusterID=CID-2c7feceb-154a-4615-be40-d6f846e421b5
cTime=0
datanodeUuid=e46b9c41-f292-47b2-b8af-ea2f00b12838
storageType=DATA_NODE
layoutVersion=-55
name下的VERSION
namespaceID=1149062121
clusterID=CID-2c7feceb-154a-4615-be40-d6f846e421b5
cTime=0
storageType=NAME_NODE
blockpoolID=BP-1808523652-192.168.237.128-1451363010425
layoutVersion=-57
两个文件中的clusterID的值应该一样。修改为一样就可以了。
多次格式化namenode的问题原因解释?
答:hdfs格式化会改变命名空间id,当首次格式化的时候datanode和namenode会产生一个相同的namespaceID,然后读取数据就可以,如果你重新执行格式化的时候,namenode的namespaceID改变了,但是datanode的namespaceID没有改变,两边就不一致了,如果重新启动或进行读写hadoop就会挂掉。
解决方案:hdfs namenode -format -force 进行强制的格式化会同时格式化namenode和datanode
补充:
NameNode 的元数据存储目录结构:
current目录为当前集群正在使用的目录,previous目录是版本升级之前的目录。版本进行回滚的时候,previous目录就会发挥作用。