当我从主节点运行start-all.sh脚本时,一些DataNode无法启动; 该日志文件会报告/ IOmp / $ MY_USER_NAME中的Java IOException:不兼容命名空间ID。
当NameNode被格式化时,会生成一个命名空间ID,这个命名空间ID本质上标识了分布式文件系统的特定实例。 当DataNode首先连接到NameNode时,它们会将该名称空间ID与数据块一起存储,因为这些块必须属于特定的文件系统。
如果DataNode稍后连接到NameNode,且NameNode声明的名称空间ID与DataNode上存储的名称空间ID不匹配,则它将拒绝以“不兼容的名称空间ID”错误操作。 这意味着DataNode已经连接到不同的NameNode,并且它所存储的块不属于该分布式文件系统。
这通常意味着你错误地放置了你的NameNode元数据。 如果您有多个HDFS安装,您的DataNode可能会连接到错误的NameNode。 如果你只有一个安装,那么你的NameNode或者运行一个不同的元数据目录,或者你以某种方式丢失了元数据,并开始一个新格式化的文件系统(这只能通过运行hadoop namenode -format )。 尝试find正确的NameNode元数据或从备份中恢复它。
每次NameNode重新格式化时,都会生成一个新的名称空间ID,并且一些机器没有得到备忘录。 解决这个问题最简单的方法是重新格式化分布式文件系统。 从HDFS中检索任何文件,然后在每台服务器上运行rm -Rf /tmp/hadoop-$MY_USER_NAME (根据您的configuration,目录path可能不同)。 然后从主服务器运行hadoop namenode -format 。 在那之后, bin/start-all.sh应该可以做到。