是的,我解决了...
java.io.IOException:不兼容的命名空间ID
如果您在 DataNode 的日志 (logs/hadoop-hduser-datanode-.log) 中看到错误 java.io.IOException: Incompatible namespaceIDs, 您可能受到问题 HDFS-107(以前称为 HADOOP-1212)的影响.
在我的机器上,完整的错误如下所示: ... ERROR org.apache.hadoop.dfs.DataNode: java.io.IOException: Incompatible namespaceIDs in /app/hadoop/tmp/dfs/data: namenode namespaceID = 308967713; datanode namespaceID = 113030094 at org.apache.hadoop.dfs.DataStorage.doTransition(DataStorage.java:281) at org.apache.hadoop.dfs.DataStorage.recoverTransitionRead(DataStorage.java:121) at org.apache.hadoop.dfs .DataNode.startDataNode(DataNode.java:230) 在 org.apache.hadoop.dfs.DataNode.(DataNode.java:199) 在 org.apache.hadoop.dfs.DataNode.makeInstance(DataNode.java:1202) 在 org .apache.hadoop.dfs.DataNode.run(DataNode.java:1146) 在 org.apache.hadoop.dfs.DataNode.createDataNode(DataNode.java:1167) 在 org.apache.hadoop.dfs.DataNode.main(DataNode .java:1326) 此刻,
解决方法 1:从头开始 我可以证明以下步骤可以解决此错误,但副作用不会让您满意(我也不会)。我发现的粗略解决方法是:
停止集群删除有问题的DataNode上的数据目录:该目录由conf/hdfs-site.xml中的dfs.data.dir指定;如果您按照本教程进行操作,则相关目录为 /app/hadoop/tmp/dfs/data 重新格式化 NameNode(注意:在此过程中所有 HDFS 数据都将丢失!) 重新启动集群 当删除所有 HDFS 数据并从头开始时不会听起来不是一个好主意(在初始设置/测试期间可能没问题),您可以尝试第二种方法。
解决方法 2:更新有问题的 DataNodes 的 namespaceID 非常感谢 Jared Stehler 的以下建议。我自己还没有测试过,但是请随时尝试一下并将您的反馈发送给我。这种解决方法是“微创”,因为您只需在有问题的 DataNode 上编辑一个文件:
停止 DataNode 在 /current/VERSION 中编辑 namespaceID 的值以匹配当前 NameNode 的值 重新启动 DataNode 如果您按照我的教程中的说明进行操作,相关文件的完整路径为:
NameNode:/app/hadoop/tmp/dfs/name/current/VERSION DataNode:/app/hadoop/tmp/dfs/data/current/VERSION(背景:dfs.data.dir默认设置为${hadoop.tmp .dir}/dfs/data,我们将本教程中的hadoop.tmp.dir设置为/app/hadoop/tmp)。
该问题的解决方案在以下站点中明确给出:
http://www.michael-noll.com/tutorials/running-hadoop-on-ubuntu-linux-multi-node-cluster/#java-io-ioexception-incompatible-namespaceids