SecondaryNamenode的作用是对数据进行持久化
首先主节点Namenode掌握着一批元数据,那么这些数据此时是在内存里的,所以为了保证元数据的安全,就出现了将内存中的数据存放到磁盘中的一种技术,那就是持久化。
断电
我们经常会遇到断电的情况,当我们的集群因断电致使电脑强制关机后重新开机,计算机就会去磁盘读取元数据,恢复到断电前的状态。
对于Namenode而言,他是不做持久化这个工作的,由于Namenode本身的工作已经很多,可能使Namenode在持久化的过程中宕机。PS:SecondaryNamenode永远无法取代Namenode的位置,他只是Namenode的一个热备。(热备:在程序运行时进行备份)
PS:持久化触发条件---------------如果超过3600s或者edits的大小超过64M
SecondaryNamenode进行持久化时会通过两个工具--------edits和fsimage。
edits是存放系统在运行过程中产生的操作信息,会生成edits.log这种文件,通过fsimage这种运输工具运输到SecondaryNamenode中转换成新的edits1和fsimage1进行合并,合并到一个fsimage中,合并之后会在通过fsimage运输回Namenode,在新的edits和fsimage上等待下一次运输合并。
那么如果在SecondaryNamenode在合并的时候,edits又超过了64M,此时会有两种解决办法:
① 如果是个别现象,Namenode会在另外启动一个edits,所以此时就会同时存在两个edits------edits1和edits2,fsimage会先和edits1合并,然后和edits2合并,之后进行以上操作。
② 如果是常见情况的话,就要考虑对集群进行调整,上调edits的大小
断电重启之后
Namenode会首先去确认Datanode的存活情况,那么Namenode是如何确认的呢?
这就说到了Namonode与Datanode的通信机制-----心跳机制。心跳机制就是每个2s,Datanode会向Namenode发送一次心跳,1分钟没有心跳,则认为Datanode挂掉。
确认Datanode挂掉以后,服务器会进入安全模式:
① 首先会读取系统日志,恢复系统状态
② 检查Datanode的信息
③ 检查过后会对有问题的Datanode进行修复
1)在传输过程中断电,数据就会丢失,如果数据特别重要,必然会在一切工作之前做好相应的调整
2)传输完成之后断电:当集群重新恢复之后,Namenode回去读取元数据,对集群状态进行恢复
3)若Datanode出现问题,在Datanode恢复之后,如果再有新的任务,根据这个Datanode的情况,确定是否将新的文件上传
特殊情况:
如果在上传block1的时候有一个Datanode挂掉,当前任务不会在上传;
之后在这个Datanode恢复之后,相当于一个新的节点,然后再有新的文件上传时才会写入到恢复的Datanode上;
那么在要计算Datanode上挂掉之前的数据时,会去另外两个有这个节点上的数据的备份中找