由于datanodeUuid值不一致导致DataNode数据目录出现Failure

由于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

处理步骤

  1. 进入“新目录/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
  2. 进入“老目录/current/”,将“VERSION”文件中的“datanodeUuid”修改成1查询到的“datanodeUuid”值。
  3. 重启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异常。

关注公众号“大模型全栈程序员”回复“小程序”获取1000个小程序打包源码。更多免费资源在http://www.gitweixin.com/?p=2627

发表评论

邮箱地址不会被公开。 必填项已用*标注