您的位置:首页 > 编程语言 > Java开发

遇到问题---Hadoop---java.io.IOException: Incompatible namespaceIDs

2016-09-06 19:31 417 查看

现象

我们前面做完了namenode format之后,用./start-all.sh 重启之后jps检查发现slave机子的datanode没有启动起来。

如图:少了datanode。



进入日志路径查看日志

cd /home/joe/hadoop/hadoop-1.2.1/libexec/../logs
ls
tail -f -n 800 hadoop-joe-datanode-hadoop1.log

发现出现了java.io.IOException: Incompatible namespaceIDs。

详细报错信息如下:

STARTUP_MSG: Starting DataNode
STARTUP_MSG: host = hadoop1/192.168.30.25
STARTUP_MSG: args = []
STARTUP_MSG: version = 1.2.1
STARTUP_MSG: build = https://svn.apache.org/repos/asf/hadoop/common/branches/branch-1.2 -r 1503152; compiled by 'mattf' on Mon Jul 22 15:23:09 PDT 2013
STARTUP_MSG: java = 1.8.0_91
************************************************************/
2016-09-05 21:09:57,024 INFO org.apache.hadoop.metrics2.impl.MetricsConfig: loaded properties from hadoop-metrics2.properties
2016-09-05 21:09:57,058 INFO org.apache.hadoop.metrics2.impl.MetricsSourceAdapter: MBean for source MetricsSystem,sub=Stats registered.
2016-09-05 21:09:57,060 INFO org.apache.hadoop.metrics2.impl.MetricsSystemImpl: Scheduled snapshot period at 10 second(s).
2016-09-05 21:09:57,060 INFO org.apache.hadoop.metrics2.impl.MetricsSystemImpl: DataNode metrics system started
2016-09-05 21:09:57,279 INFO org.apache.hadoop.metrics2.impl.MetricsSourceAdapter: MBean for source ugi registered.
2016-09-05 21:09:58,113 ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: java.io.IOException: Incompatible namespaceIDs in /home/joe/hadoop/hadooptmpdir/dfs/data: namenode namespaceID = 883720225; datanode namespaceID = 1713418829
at org.apache.hadoop.hdfs.server.datanode.DataStorage.doTransition(DataStorage.java:232)
at org.apache.hadoop.hdfs.server.datanode.DataStorage.recoverTransitionRead(DataStorage.java:147)
at org.apache.hadoop.hdfs.server.datanode.DataNode.startDataNode(DataNode.java:414)
at org.apache.hadoop.hdfs.server.datanode.DataNode.<init>(DataNode.java:321)
at org.apache.hadoop.hdfs.server.datanode.DataNode.makeInstance(DataNode.java:1712)
at org.apache.hadoop.hdfs.server.datanode.DataNode.instantiateDataNode(DataNode.java:1651)
at org.apache.hadoop.hdfs.server.datanode.DataNode.createDataNode(DataNode.java:1669)
at org.apache.hadoop.hdfs.server.datanode.DataNode.secureMain(DataNode.java:1795)
at org.apache.hadoop.hdfs.server.datanode.DataNode.main(DataNode.java:1812)

2016-09-05 21:09:58,114 INFO org.apache.hadoop.hdfs.server.datanode.DataNode: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down DataNode at hadoop1/192.168.30.25
************************************************************/

原因

每次namenode format会重新创建一个namenodeId,而tmp/dfs/data下包含了上次format下的id,namenode format清空了namenode下的数据,但是没有清空datanode下的数据,所以id会对应不起,导致启动时失败。

解决方法

现在已知的3种解决方法,一种是删除datanode下的数据,但这种方法会造成数据丢失。

方法2是重新配置一个新的空目录给datanode保存数据。这种数据没丢失,但是启动后datanode是找不到之前的文件的。(也相当于数据丢失了)。

方法3是修改namenodeId,使namenodeId一致。再重新启动即可。(推荐)

除了测试环境或者全部格式化,否则不建议使用前2种方法。

方法一

清空namenode的数据存放目录

数据存放目录我们之前在conf/hdfs-site.xml中有设置dfs.data.dir,可以找到自己对应的目录。

如果没有设置,默认是目录:hadooptmpdir/dfs/data。(不同版本可能有差异)具体可以在安装目录的上层去找找。我的目录如图:



执行命令

rm -r  /home/joe/hadoop/hadooptmpdir/dfs/data


再启动hadoop即可:

cd /home/joe/hadoop/hadoop-1.2.1/bin
./start-all.sh


方法二

重新配置一个数据保存的路径。

也就是conf/hdfs-site.xml中的设置dfs.data.dir。

vim /home/joe/hadoop/hadoop-1.2.1/conf/hdfs-site.xml


比如修改(新增)如下:

<property>
<name>hadoop.tmp.dir</name>
<value>
/home/joe/hadoop/hadoop-${user.name}
</value>
</property>


再启动hadoop即可:

cd /home/joe/hadoop/hadoop-1.2.1/bin
./start-all.sh


方法三

将旧datanode上的namespaceID修改成和namenode上的namespaceID一样,

namenode上的namespaceID的位置为:namenode数据存数目录下的current/VERSION文件里。dfs/name/current/VERSION里。

datanode上存储namespaceID的位置为:datanode数据存数目录下的current/VERSION文件里。dfs/data/current/VERSION,将其中的namespaceID修改为namenode上的namespaceID,重新启动即可。

或者根据报错信息我们也可以知道
namenode namespaceID = 883720225; datanode namespaceID = 1713418829。

也就是需要将dfs/data/current/VERSION文件中的namespaceID修改为883720225。

vim  /home/joe/hadoop/hadooptmpdir/dfs/data/current/VERSION




把1713418829修改成883720225即可。



重启Hadoop

cd /home/joe/hadoop/hadoop-1.2.1/bin
./start-all.sh 


jps查看datanode是否启动起来:



cd /home/joe/hadoop/hadoop-1.2.1/bin./start-all.sh
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐