Hadoop的集群搭建过程相对复杂,很容易就会导出错误,例如不小心重复格式化集群,就会影响集群的正常使用。要想解决这个问题,首先要搞清楚Hadoop在格式化和启动datanode时的相关过程,这样就可以轻松解决了。
通过搭建Hadoop环境,了解到hdfs 有三个不同角色的节点:
namenode 主要用于存储元数据
datanode 负责集群中具体数据的存储
secondarynamenode 是namenode的备份
格式化过程
格式化其实是重置namenode元数据的过程。与namenode & datanode存储相关的配置,保存在hdfs-site.xml:
<property>
<name>dfs.namenode.name.dir</name>
<value>/home/hadoop/data/hadoopdata/name</value>
<description>为了保证元数据的安全一般配置多个不同的目录</description>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/home/hadoop/data/hadoopdata/data</value>
<description>datanode 的数据存储目录</description>
</property>
在执行格式化命令(hadoop namenode -format)后,Hadoop会自动创建dfs.namenode.name.dir的目录,并在目录下自动生成current目录,在current中存在VERSION版本文件:
cat VERSION
#Sun Feb 02 20:44:59 CST 2020
namespaceID=936012820
clusterID=CID-62656453-4132-487a-951f-d71b0c45e6f1
cTime=1580647499119
storageType=NAME_NODE
blockpoolID=BP-971909260-192.168.2.201-1580647499119
layoutVersion=-64
namenode 的 VERSION用于记录集群的版本信息,其中clusterID是集群版本标识,每次format都会生成不同的ID。
datanode的启动
格式化后,正常启动hdfs:
start-dfs.sh
执行后,会启动namenode、secondarynamenode、datanode节点,其中datanode的数据目录中,也会自动生成current目录,并生成VERSION版本文件:
#Sun Feb 02 20:52:28 CST 2020
storageID=DS-6a4a7b5e-a788-4939-a0d3-c3297411a127
clusterID=CID-62656453-4132-487a-951f-d71b0c45e6f1
cTime=0
datanodeUuid=5f28f894-0adb-4768-80b6-1cf9f855b4ee
storageType=DATA_NODE
layoutVersion=-57
datanode 的 VERSION 保存的是datanode的版本相关信息,其中clusterID标识它是属于哪个集群的,namenode 和 datanode的这两个值一致时,才会认为是同一个集群。
如果在格式化成功后,再次格式化,结果将会是namenode的clusterID会改变,而datanode的clusterID却不会变化。这种情况下,启动集群,datanode进程虽然也会启动,但与namenode确认clusterID后,发现不一致,就会自动退出了。
重新格式化
了解了相关过程后,如果希望再次格式化可以这样处理:
1)、删除namenode的数据目录,在namenode节点执行
rm -rf /home/hadoop/data/hadoopdata/name
2)、删除datanode的数据目录,在所有datanode节点执行
rm -rf /home/hadoop/data/hadoopdata/data
删除这两个目录后,再执行格式化就可以正常使用了。