Hadoop 2.7.x NameNode重新格式化后导致DataNode无法启动问题

来源:互联网 发布:安卓手机数据恢复工具 编辑:程序博客网 时间:2024/06/05 14:38

简介

Hadoop 2.7.x伪分布式运行环境下,由于NameNode重新格式化后,导致DataNode无法正常启动。本文总结了此问题的解决方法和思路,供个人参考。

问题描述

通过脚本start-dfs.sh启动hadoop, 运行hadoop fs命令出现异常信息:

hadoop@bob-virtual-machine:~$ start-dfs.sh Starting namenodes on [localhost]localhost: starting namenode, logging to /usr/local/hadoop-2.7.3/logs/hadoop-hadoop-namenode-bob-virtual-machine.outlocalhost: starting datanode, logging to /usr/local/hadoop-2.7.3/logs/hadoop-hadoop-datanode-bob-virtual-machine.outStarting secondary namenodes [0.0.0.0]0.0.0.0: starting secondarynamenode, logging to /usr/local/hadoop-2.7.3/logs/hadoop-hadoop-secondarynamenode-bob-virtual-machine.outhadoop@bob-virtual-machine:~$ hadoop fs -put -l /home/hadoop/hadoop-2.7.3/README.txt wordcount/README.txt17/01/31 18:34:30 WARN hdfs.DFSClient: DataStreamer Exceptionorg.apache.hadoop.ipc.RemoteException(java.io.IOException): File /user/hadoop/wordcount/README.txt._COPYING_ could only be replicated to 0 nodes instead of minReplication (=1).  There are 0 datanode(s) running and no node(s) are excluded in this operation.        at org.apache.hadoop.hdfs.server.blockmanagement.BlockManager.chooseTarget4NewBlock(BlockManager.java:1571)
从输出的异常信息:There are 0 datanode(s) running and no node(s) are excluded in this operation. 发现DataNode并没有正常启动起来。通过jps命令查看,确实没有发现DataNode的服务进程:

hadoop@bob-virtual-machine:~$ jps2160 SecondaryNameNode1815 NameNode2410 Jps

问题排查

经过上面的分析,我们发现DataNode没有能够正常启动,接下来如何分析呢? 最直接的方法使分析DataNode启动过程的log信息,看能否找到可用的信息。hadoop的log信息存放在安装目录的logs下,很容易找到datanode相关的log文件。分析其中输出信息发现:

2017-01-31 18:52:28,708 WARN org.apache.hadoop.hdfs.server.common.Storage: Failed to add storage directory [DISK]file:/usr/local/hadoop/tmp/dfs/data/java.io.IOException: Incompatible clusterIDs in /usr/local/hadoop-2.7.3/tmp/dfs/data: namenode clusterID = CID-af858ec6-019a-48bb-81c7-beecee82a64f; datanode clusterID = CID-31b1c3ac-8dfa-45bf-a35a-c519700d7d9b        at org.apache.hadoop.hdfs.server.datanode.DataStorage.doTransition(DataStorage.java:775)        at org.apache.hadoop.hdfs.server.datanode.DataStorage.loadStorageDirectory(DataStorage.java:300)        at org.apache.hadoop.hdfs.server.datanode.DataStorage.loadDataStorage(DataStorage.java:416)        at org.apache.hadoop.hdfs.server.datanode.DataStorage.addStorageLocations(DataStorage.java:395)        at org.apache.hadoop.hdfs.server.datanode.DataStorage.recoverTransitionRead(DataStorage.java:573)        at org.apache.hadoop.hdfs.server.datanode.DataNode.initStorage(DataNode.java:1362)        at org.apache.hadoop.hdfs.server.datanode.DataNode.initBlockPool(DataNode.java:1327)        at org.apache.hadoop.hdfs.server.datanode.BPOfferService.verifyAndSetNamespaceInfo(BPOfferService.java:317)        at org.apache.hadoop.hdfs.server.datanode.BPServiceActor.connectToNNAndHandshake(BPServiceActor.java:223)        at org.apache.hadoop.hdfs.server.datanode.BPServiceActor.run(BPServiceActor.java:802)        at java.lang.Thread.run(Thread.java:748)
输出信息显示namenode和datanode的clusterID不兼容,这就是问题的原因。

问题解决

知道问题的原因,解决起来就比较容易了。查看hdfs-site.xml配置文件,查看namenode和datanode的工作目录:

hadoop@bob-virtual-machine:/usr/local/hadoop/etc/hadoop$ cat hdfs-site.xml<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet type="text/xsl" href="configuration.xsl"?><!-- Put site-specific property overrides in this file. --><configuration>    <property>        <name>dfs.replication</name>        <value>1</value>    </property>    <property>        <name>dfs.namenode.name.dir</name>        <value>file:/usr/local/hadoop/tmp/dfs/name</value>    </property>    <property>        <name>dfs.datanode.data.dir</name>        <value>file:/usr/local/hadoop/tmp/dfs/data</value>    </property></configuration>
在datanode的工作目录下,可以找到current/VERSION文件,我们查看其内容发现有clusterID相关的配置,将其修改为与namenode中的配置一致。

hadoop@bob-virtual-machine:/usr/local/hadoop/tmp/dfs/data/current$ cat VERSION#Tue Jan 31 19:07:03 EST 2017storageID=DS-4c553ffa-1f5f-4be8-b19e-86463eb742caclusterID=CID-af858ec6-019a-48bb-81c7-beecee82a64fcTime=0datanodeUuid=7dd45c60-3e11-4fbf-9435-eab7d97329fbstorageType=DATA_NODElayoutVersion=-56
重新启动hadoop后,datanode开始工作正常。

总结

究其原因,是因为问题出现之前,在排查其它问题时,个人重新执行hdfs namenode -format,导致namenode的current目录会被删除并进行重建,其clusterID也会发生变化,而datanode中的配置并没有随namenode发生变化,造成了两个clusterID不一致问题。因此为避免这种情况的发生,在namenode重新格式化后,需要修改datanode的clusterID的配置,或者删除datanode的current文件夹,以保持namenode和datanode配置一致。如果删除datanode的current目录,需要为当前用户重新创建工作目录:hdfs dfs -mkdir -p /user/user-name。

阅读全文
0 0
原创粉丝点击