bug:datanode启动后立刻死掉:java.io.IOException: Incompatible clusterIDs in....

来源:互联网 发布:linux rpm 安装目录 编辑:程序博客网 时间:2024/06/05 02:34
错误描述:
     搭建伪分布式hadoop时,format namenode之后,start-dfs.sh启动hdfs,jps发现datanode启动后不久就自动死掉了。在日志文件:/usr/local/hadoop/hadoop-2.6.0/logs/hadoop-liuxianfa-datanode-liuxianfa8.out中看到如下报错信息。上网查了一下,发现了解决办法如下。

(注意:liuxianfa8机器上的hadoop的版本为hadoop2.6.0, 旧的版本和此版本的解决方法不同)
异常信息:(这里的异常信息是我自己搭建的时候的异常信息。原来文章的异常信息删掉了。)
java.io.IOException: Incompatible clusterIDs in /usr/local/hadoop/hadoop-2.6.0/data/tmp/dfs/data: namenode clusterID = CID-c602bccc-3af9-431d-8391-f57b9660d078; datanode clusterID = CID-48c46c43-8a44-4096-93bf-61d9942c8e2b
    at org.apache.hadoop.hdfs.server.datanode.DataStorage.doTransition(DataStorage.java:646)
    at org.apache.hadoop.hdfs.server.datanode.DataStorage.addStorageLocations(DataStorage.java:320)
    at org.apache.hadoop.hdfs.server.datanode.DataStorage.recoverTransitionRead(DataStorage.java:403)
    at org.apache.hadoop.hdfs.server.datanode.DataStorage.recoverTransitionRead(DataStorage.java:422)
    at org.apache.hadoop.hdfs.server.datanode.DataNode.initStorage(DataNode.java:1311)
    at org.apache.hadoop.hdfs.server.datanode.DataNode.initBlockPool(DataNode.java:1276)
    at org.apache.hadoop.hdfs.server.datanode.BPOfferService.verifyAndSetNamespaceInfo(BPOfferService.java:314)
    at org.apache.hadoop.hdfs.server.datanode.BPServiceActor.connectToNNAndHandshake(BPServiceActor.java:220)
    at org.apache.hadoop.hdfs.server.datanode.BPServiceActor.run(BPServiceActor.java:828)
    at java.lang.Thread.run(Thread.java:745)

出错原因
  hadoop的升级功能需要data-node在它的版本文件里存储一个永久性的clusterID,当datanode启动时会检查并匹配namenode的版本文件里的clusterID,如果两者不匹配,就会出现"Incompatible clusterIDs"的异常。
  每次格式化namenode都会生成一个新的clusterID, 如果只格式化了namenode,没有格式化此datanode, 就会出现”java.io.IOException: Incompatible namespaceIDs“异常。

  参见官方CCR[HDFS-107]

 

解决之道:

 此异常可从官方CCRs里找到:HDFS-107(formerly known asHADOOP-1212)

solution1 Start from scratch

1. stop the full cluster
2. 删除出现问题的datanode上的{user}, 此变量是在$HADOOP_CONF_DIR/下的hdfs-site.xml里定义的。
3. 重新格式化namenode, 此后所有在hdfs上的数据都将被擦除!
4. restart the cluster

solution2 手动更新clusterID
(旧的版本对应更新namespaceID(MRV1))
1. 在namenode上, ${dfs.namenode.name.dir}/current/VERSION 里找到clusterID  ( ${dfs.namenode.name.dir}在hdfs-site.xml里定义,下同)(默认在core-site.xml文件中的${hadoop.tmp.dir}/dfs/name/current/VERSION
2. 在出问题的datanode上, ${dfs.namenode.data.dir}/current/VERSION 里找到clusterID, 用步骤1中得到的clusterID覆盖之。
3. 在问题节点上重启datanode.
评注: 此方法不用格式化dfs, 为首选方法, 这样看来,只有脑残才会用solution1, 而我看了很多大陆人写的博客,偏偏就选择用solution1来解决此问题。
0 0
原创粉丝点击