前言
我们知道hadoop集群搭建之后,并不能马上启动集群进行使用,需要对namenode做格式化。具体执行的命令:hadoop namenode -format。namenode格式化是删除hdfs-site.xml中dfs.namenode.name.dir指定目录下已有的文件信息(包含fsimage和edit文件),然后在该目录下创建VERSION等文件。初次使用集群必须执行,但对已有数据的集群,会导致集群不可用。如若是非HA集群,会导致丢失所有数据的严重后果。
背景
用户反馈HDFS集群崩溃,namenode UI页面上看到大量的MISSING blocks,集群不可用。
问题定位
查看namenode日志,发现如下异常,journalnode的namespaceid和clusterid和主备namenode不一致,定位出有人对集群进行过格式化操作,导致集群不可用
解决方案
1、手动修改journalnode,主active的配置与备namenode保持一致,改动文件/data/emr/hdfs/journalnode/hadoop/current/VERSION。修改上述文件的namespaceID和clusterID保持和备NN一致即可(EMR集群位于NN节点/data/emr/hdfs/namenode/current/VERSION)。
2、将备namenode current目录copy到主namenode同样位置下,删除备namenode current目录下文件,重启主namenode。
3、重启journalnode,执行hdfs namenode -initializeSharedEdits命令, 将所有journal node的元文件的VERSION文件的参数修改成与主namenode的元数据相同。因edits log有较大文件,调整参数 ipc.maximum.data.length 536870912
4、在主namenode执行hdfs namenode -bootstrapStandby, 将active namenode的 {dfs.namenode.name.dir} 目录的内容复制到 standby namenode的{dfs.namenode.name.dir} 目录下,重启备namenode。
5、发现备安全模式退出缓慢,原因是namenode已经提供读写,并且DN全量块上报导致备NN压力大,监测到有DN块上报超时,所以调整namenode检测datanode健康状态超时参数dfs.namenode.heartbeat.recheck-interval 修改为300000。
DN被认定下线的标准为:超过10*心跳时间 2*dfs.namenode.heartbeat.recheck-interval时间NN未接收到DN的心跳