在启动Hadoop集群时,往往会出现这样或那样的问题,比如节点中DataNode进程启动不了,很是让人头疼,下面说下具体的解决办法(复杂版),简单版见最后:
(1)停止关于Hadoop的所有进程
(2)删除每个节点Hadoop目录下 logs 和 tmp 文件夹,命令如下:
sudo rm -rf logs
sudo rm -rf tmp
(3)手动重新创建每个节点下 logs 和 tmp 文件夹,命令如下:
mkdir logs
mkdir tmp
(4)cd到Hadoop/bin目录下,重新格式化:
hdfs namenode -format
没有问题后,重新启动hadoop集群,DataNode进程成功启动。
具体的原因还是:
datanode的clusterID 和 namenode的clusterID 不匹配
成功启动DataNode进程后,我们可以查看各节点tmp目录下文件。
作为namenode节点,其文件目录为:hadoop/tmp/dfs/name/current;
作为datanode节点,其文件目录为:hadoop/tmp/dfs/data/current;
在目录下我们使用 cat 命令查看 VERSION 文件,分别为:
[hadoop@slave01 current]$ cat VERSION
#Mon Jun 25 10:15:16 CST 2018
namespaceID=2112363039
clusterID=CID-5a83590f-0667-49f7-a7ee-c27165216e28
cTime=0
storageType=NAME_NODE
blockpoolID=BP-1317085386-127.0.0.1-1529892916541
layoutVersion=-63
[hadoop@slave02 current]$ cat VERSION
#Mon Jun 25 10:16:52 CST 2018
storageID=DS-554910b7-5a75-4a41-a7c2-4f9d137dfd9d
clusterID=CID-5a83590f-0667-49f7-a7ee-c27165216e28
cTime=0
datanodeUuid=3cdb4500-3548-471e-86bc-7daea441fb26
storageType=DATA_NODE
layoutVersion=-56
可以看出:namenode和datanode的clusterID是一致的。
所以,重新格式化的操作不要随便使用,这可能导致两个clusterID不一致,引起进程启动不了的问题,网上也有说不用重新格式化和删除目录,而是通过将namenode下的clusterID复制到datanode下的clusterID,覆盖掉原来的,让两个保持一致,这种方式没试过,不知道好使不好使,大家可以尝试下(该方式已被证实,亲测可用哦)。