由于datanodeUuid值不一致导致DataNode数据目录出现Failure
现象描述
在“dfs.datanode.data.dir”中添加新目录后,发现老的目录出现failure。
由于datanodeUuid值不一致导致DataNode数据目录出现Failure
可能原因
新老目录下“VERSION”文件里的“datanodeUuid”值不一致。
定位思路
查看DataNode的日志文件,检查是否有InconsistentFSStateException异常信息,是否显示“datanodeUuid”不一致。
heartbeating to 9-96-101-251/172.18.0.111:25000 | org.apache.hadoop.hdfs.server.common.InconsistentFSStateException: Directory /export4/BigData/datanode/dn3 is in an inconsistent state:
Root /export4/BigData/datanode/dn3: DatanodeUuid=2a8c2266-7d3f-428c-b47f-6c7e2500bdc5, does not match 3d61ca33-c3ba-4c73-998a-7667c747545d from other StorageDirectory. | DataStorage.java:375
处理步骤
- 进入“新目录/current/”,查询“VERSION”文件中的“datanodeUuid”值。
#Tue Jul 05 22:23:04 CST 2016
storageID=DS-7c410c98-29bc-49de-b3dd-87cd48d4f7d3
clusterID=myhacluster
cTime=0
datanodeUuid=3d61ca33-c3ba-4c73-998a-7667c747545d
storageType=DATA_NODE
layoutVersion=-56
- 进入“老目录/current/”,将“VERSION”文件中的“datanodeUuid”修改成1查询到的“datanodeUuid”值。
- 重启DataNode。
参考信息
DataNode启动时,会从数据目录中的“VERSION”文件中读取“datanodeUuid”值,并将该值写入到系统的DataStorage对象中。每个DataNode对应一个“datanodeUuid”值,即同一个DataNode上的所有目录使用同一个“datanodeUuid”值。
该问题中,删除老目录,添加新目录时,“VERSION”文件并没有被拷贝到新目录中,重启DataNode后,新目录中的“VERSION”文件由format操作生成,并自动生成了一个新的“datanodeUuid”值。
将老目录加回到“dfs.datanode.data.dir”中,并且位于新目录之前,重启DataNode后,DataNode会先从老目录中加载“VERSION”文件,读取其中的“datanodeUuid”值,并写入到系统的DataStorage对象中。再从新目录中的“VERSION”文件中读取“datanodeUuid”值并与系统的DataStorage对象中的“datanodeUuid”值作对比时,由于新目录中的“datanodeUuid”值是后来重新生成的,与老目录中的不同,所以系统会抛出“datanodeUuid”不匹配的InconsistentFSStateException异常。