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