最近由于重装了系统,需要对之前搭建的集群要做些改动。在对每个虚拟机的网络进行正确的配置之后,重新执行hadoop/sbin/start-dfs.sh命令来启动HDFS,然而namenode却无法识别datanode。
后来通过对之前学过的知识进行回顾和梳理发现了问题的所在:
由于场景的改变造成了虚拟机IP地址的改变,在这里虽然在虚拟机中配置网络的IP也做了相应的改变,但是Hadoop集群中的一些自动生成旧文件的内容依旧和你以前的IP地址有关,这就造成NameNode无法识别之前的DataNode。
解决办法:
首先了解下namenode初始化工作目录的形成,我们在执行hdfs namenode -format 时只是初始化了namenode的工作目录,而datanode的工作目录是在datanode启动后自己初始化的。所以在这里首先要把各个DataNode下的工作目录进行删除(即HDFS的文件存储目录:hddata/dfs/current目录下的内容全部进行删除)。(如果某个DataNode的工作目录未进行删除,则通过相应的web网页去看HDFS的存储内存时依旧观察不到该DataNode)
其次namenode在format初始化的时候会形成两个标识:
blockPoolId:
clusterId:
新的datanode加入时,会获取这两个标识作为自己工作目录中的标识,一旦namenode重新format后,namenode的身份标识已变,而datanode如果依然持有原来的id,就不会被namenode识别。
所以只需要我们把各个DataNode上的工作目录进行删除后,然后在对hadoop的bin目录下执行namenode-format命令即可识别DataNode。