开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第20天,点击查看活动详情
前言
今天我们主要学习Hadoop—HDFS的安全模式要点和SecondaryNameNode同步流程。
安全模式要点
- HDFS搭建时会格式化,格式化操作会产生一个空的FsImage
- 当Namenode启动时,它从硬盘中读取Editlog和FsImage
- 将所有Editlog中的事务作用在内存中的FsImage上
- 并将这个新版本的FsImage从内存中保存到本地磁盘上
- 然后删除旧的Editlog,因为这个旧的Editlog的事务都已经作用在Fslmage上了
- Namenode启动后会进入一个称为安全模式的特殊状态
- 处于安全模式的Namenode是不会进行数据块的复制的。
- Namenode从所有的 Datanode接收心跳信号和块状态报告。
- 每当Namenode检测确认某个数据块的副本数目达到这个最小值,那么该数据块就会被认为是副本安全(safely replicated)的
- 在一定百分比(这个参数可配置)的数据块被Namenode检测确认是安全之后(加上一个额外的30秒等待时间),Namenode将退出安全模式状态
- 接下来它会确定还有哪些数据块的副本没有达到指定数目,并将这些数据块复制到其他Datanode上
HDFS中的SNN
- SecondaryNameNode(SNN)在非Ha模式下,SNN一般是独立的节点,周期完成对NN的EditLog向Fslmage合并,减少EditLog大小,减少NN启动时间
- 根据配置文件设置的时间间隔fs.checkpoint.period 默认3600秒
- 根据配置文件设置edits log大小fs.checkpointsize 规定edits文件的最大值默认是64MB
综上所述,结合下图我们再来讲一讲具体的一个流程。
有一台Primary NameNode和一台Secondary NameNode,根据我们已知的知识点,当第一次搭建集群的时候,FSImage是空的。
假设8点启动集群,这时候FSImage是空的,Edits从8点开始记录操作。到9点的时候,FSImage还是空的,Edits有8到9点的操作记录,这时候Secondary NameNode会从Primary NameNode拉取edits和FSImage。Primary NameNode继续自己的工作,重新用一个edits记录9点之后增量的操作。Secondary NameNode会把拉取到的edits和FSImage加载到内存中,然后根据edits将空的FSImage恢复到9点那一刻的数据,最后把这个包含9点的FSImage推到Primary NameNode中。这时候Primary NameNode中8点的Edits和FSImage就失效了,如果此时服务挂了,那只要用9点之后的edits和9点的FSImage就可以恢复之前的数据(内存状态)。