今天在从HA切换到普通集群环境的时候,在启动namenode后,namenode一下子就挂了,然后打开日志查看相关namenode的日志,发现报了以下的一个错误:大概意思是读取日志文件的时候没有读取到。
通过上面的信息,我们不清楚他为啥会报这样的一个错误,下面我们一起来看一下namenode的启动过程:
可以看到报错信息中调用了一个方法叫loadFromDisk和loadFSImage,因此在namenode启动的时候需要加载两个东西;
最后报错的源代码:
通过代码可以看到当流里面没有数据或者流里面的第一个txid大于你传进来的值,都会跳出循环,跳出循环后将会抛出一个IOException,即是我们上面截图所报的异常;
FSImage
Namenode会将HDFS的文件和目录元数据存储在一个叫fsimage的二进制文件中,每次保存fsimage之后到下次保存之间的所有hdfs操作,将会记录在editlog文件中,当editlog达到一定的大小(bytes,由fs.checkpoint.size参数定义)或从上次保存过后一定时间段过后(sec,由fs.checkpoint.period参数定义),namenode会重新将内存中对整个HDFS的目录树和文件元数据刷到fsimage文件中。Namenode就是通过这种方式来保证HDFS中元数据信息的安全性;
Fsimage是一个二进制文件,当中记录了HDFS中所有文件和目录的元数据信息;
当NN启动时,Hadoop将加载fsimage并应用所有编辑日志,同时进行大量的一致性检查,如果检查失败,它将中止;
解决方法:
1 在hadoop的目录下执行指令 bin/hadoop namenode -recover;
2 选择yes 然后选择C,再选择C;
3 重新启动namenode节点