今天有个学生问我一个问题,说自己搭建的hadoop环境,在启动后通过jps指令查看进程发现DateNode进程消失了,不知道是什么原因,下面看看我们是如何来解决的!
第一步:DataNode进程启动失败需要确定启动失败的原因,可以到logs目录查看对应的datanode日志信息。
如果你没有自定义配置日志输出目录,那就默认在${HADOOP_HOME}/logs目录下,通过指令或者下载datanode相关日志文件到本地查看异常信息,这里我们发现异常如下:
java.io.IOException: Incompatible clusterIDs in /opt/modules/hadoop-2.5.0/data/tmp/dfs/data: namenode clusterID = CID-2904e8aa-ff11-4ae7-a64e-c1c8269d1905; datanode clusterID = hadoop-senior.nixuange.com
at org.apache.hadoop.hdfs.server.datanode.DataStorage.doTransition(DataStorage.java:477)
at org.apache.hadoop.hdfs.server.datanode.DataStorage.recoverTransitionRead(DataStorage.java:226)
at org.apache.hadoop.hdfs.server.datanode.DataStorage.recoverTransitionRead(DataStorage.java:254)
at org.apache.hadoop.hdfs.server.datanode.DataNode.initStorage(DataNode.java:975)
at org.apache.hadoop.hdfs.server.datanode.DataNode.initBlockPool(DataNode.java:946)
at org.apache.hadoop.hdfs.server.datanode.BPOfferService.verifyAndSetNamespaceInfo(BPOfferService.java:278)
at org.apache.hadoop.hdfs.server.datanode.BPServiceActor.connectToNNAndHandshake(BPServiceActor.java:220)
at org.apache.hadoop.hdfs.server.datanode.BPServiceActor.run(BPServiceActor.java:812)
at java.lang.Thread.run(Thread.java:745)
第二步:发现异常原因
我们通过异常信息发现发生异常的原因在于namenode 的clusterID 和datanode clusterID 不一致导致的。
namenode clusterID = CID-2904e8aa-ff11-4ae7-a64e-c1c8269d1905; datanode clusterID = hadoop-senior.nixuange.com
第三步:解决方案
方案1:直接删除hdfs目录,重新格式化hdfs,不过不建议这一种,原因就是太暴力,不适用于生产环境。
方案2:推荐使用
1)查看hdfs-site.xml配置
找到dfs.name.dir(元数据保存目录)和dfs.data.dir(hdfs数据保存目录)的配置(hadoop3.x可能是dfs.namenode.name.dir和dfs.datanode.data.dir,在官方文档有默认值)
2)到主节点的${dfs.name.dir}/current下查看VERSION文件,查看clusterID
到从节点的${dfs.data.dir}/current下查看VERSION文件,查看clusterID
发现,两者确实不一样!
3)修改从节点VERSION文件的clusterID与主节点一致
4)保存退出,重启hadoop,发现DataNode进程正常启动。
补充:
1)如果不会搭建hadoop环境可以参考我的大数据系列教程中的问章:
2)clusterID不一致原因:
当我们执行文件系统格式化时,会在namenode数据文件夹(即配置文件中dfs.name.dir在本地系统的路径)中保存一个current/VERSION文件,记录clusterID,标识了所格式化的 namenode的版本。如果我们频繁的格式化namenode,那么datanode中保存(即配置文件中dfs.data.dir在本地系统的路径)的current/VERSION文件只是你第一次格式化时保存的namenode的ID,因此就会造成datanode与namenode之间的id不一致。