SecondaryNamenode------持久化
-
为什么要用持久化
Namenode掌握一批元数据(描述数据的数据)-------放在内存里
硬盘:内存大,便宜,但是慢
内存:内存小,贵,但是快
持久化:当我们的集群因断电等特殊原因产生问题的时候,问题解决,重新开机,会去磁盘上读 取元数据,恢复到断电前的状态
总之,持久化就是为了保证元数据的安全-----将内存中的数据存放到磁盘中 -
Namenode不会进行持久化的原因
可以做:需求小,占用内存少,不影响计算效率
也可以不做:Namenode本身工作量已经很多,有可能在持久化的过程中宕机备注:SecondaryNamenode永远无法取代Namenode的位置,它只是Namenode的一个热备
-
持久化‘流程
1.edits.log 存放系统在运行过程中产生的操作信息
2.个别现象:另外在启动一个edits里面会同时存在两个edits.log,edits1.log和edits2.log,fsimage会先和edits1.log进行合并,然后合并edits2.log
3.常态:就需要对集群进行调整,调大edits.log的大小持久化的触发条件-------超过3600S或者edits.log的大小超过64M
总结:持久化就是将Namenode的元数据写入到磁盘中进行存储,当Namenode挂了之后,重启的时候会去磁盘读取相应的元数据,恢复集群的状态(内存断电丢失数据)
断电:
持久化之前 -----在此启动,读取系统日志
持久化之后 -----读取磁盘中的数据,恢复状态
重复的断电:
Namenode和Datenode的通信机制-----心跳机制(每隔三秒,Datenode会向Namenode发送一次心跳,一分钟没有心跳,则认为Datenode挂了) -
安全模式
1.恢复系统状态
2.检查Datenode的信息
3.有问题的Datenode进行修复
在传输的过程中断电-----数据丢失(如果数据特别重要,那只能提前进行预判,进行相应的调整)
在传输完成之后断电,当我的集群重新恢复之后,Namenode会去读取元数据,对状态进行相应的回复
若Datenode出现问题,在Datenode恢复之后,如果新的任务,根据情况,确定是否将新的文件上传
当上传block1的时候Datenode3挂掉,当前任务不会在上传
当Datenode3恢复之后,相当于一个新的节点
当有新任务的时候才会写入到恢复的Datenode3上
当要计算Datenode3上的挂掉之前的数据的时候,会去Datenode1和Datenode2上寻找