1 NameNode和DataNode之间的心跳机制
1)NameNode启动时,会启动一个IPC server服务,
2)DataNode启动后会被动连贯NameNode的IP server服务,默认每隔3秒连贯一次,也就是心跳。
这个工夫能够通过 dfs.heartbeat.interval参数设置,也就是心跳工夫。
3)DataNode通过心跳在NameNode注册汇报本人的状态,NameNode通过心跳获取DataNode的状态和下达指令。
4)当NameNode长时间没有收到DataNode的心跳,就认为DataNode挂掉了。
这种心跳机制同样存在于Yarn中ResourceManager和NodeManager中。
这个就是Hadoop的Master/Slave架构,NameNode和ResourceManager就是Master,DataNode和NodeManager就是Slave。
2 NameNode和SecondaryNameNode的工作机制
第一个问题,NameNode元数据怎么保留的?
首先NaomNode的元数据须要放在内存中,因为咱们须要常常拜访NameNode节点获取元数据,若是放在磁盘中,那效率会非常低。
既然放在内存中,那必要要有一个机制保障内存数据的平安,因为内存中数据一旦断电就丢了,所以内存中的元数据也必须要落地到磁盘,这个就是FstImage.
但这样还没有到高枕无忧的境地,内存中的元数据随时可能更新,这时是否要同步更新FsImage呢?如果咱们更新,必然会导致效率底下,如果咱们不更新,那内存中的元数据和FsImage就会不统一,一旦呈现NameNode节点断电之类的状况,就会呈现局部数据失落。
那么咱们引入这样一个记录文件Edits,只有内存中的元数据减少或者更新,那么就同步把这个操作记录追加到Edits,这样即使NameNode断电,咱们还能够依据Edits和FsImage来复原元数据。
新的问题又来了,内存中的元数据可是常常发生变化的,那一直的追加记录到Edits中,那必然会导致这个文件越来越大,那么将来咱们须要复原元数据时,须要破费的工夫也必然大大增加,影响咱们效率,所以咱们须要定期对FsImage和Edits进行合并。
好了,工作来了,定义把FsImage和Edits进行合并,那这个工作谁来做呢?NameNode能够吗?当然能够,但这会导致NameNode工作过重,影响效率,那为了保障效率,就把这个工作交给另外一个人来做,那就是Secondary NameNode。
从这里能够明确Secondary NameNode并不是NameNode的热备,当NameNode挂了的时候,它并不能代替NameNode工作,但它能够用帮忙复原NameNode。
具体NameNode和Secondary NameNode的工作流程如下
阶段1:
1)首次启动集群后,咱们须要对NameNode格式化,这时会创立FsImage和Edits,这些文件就在$HADOOP_HOME/data/name/current下.
之后启动,间接加载Edits和FsImage到内存中。
2)Client也就是客户端对元数据进行增删改的操作申请。
3)NameNode先记录操作,更新日志,而后在内存中对元数据进行增删改的操作。
阶段2:
SecondaryNameNode执行合并的操作,叫CheckPoint,这个操作有两个触发条件。
第一个,就是间隔时间到,默认是1小时,这个能够调整。
第二个,就是SecondaryNameNode会一分钟查看一次操作次数,当操作数达到设置的下限,就会触发。
1)首先SecondaryNameNode会询问NameNode是否须要执行CheckPoint
2)拿到NameNode的返回后果,就开始申请执行CheckPoint
3)NameNode滚动更新正在的Edits日志,将滚动前的Edits和FsImage文件拷贝到SecondaryNameNode上。
4)SecondaryNameNode将两个文件加载到内存进行合并,生成新的fsImage.chkpoint,拷贝到NameNode上。
5)NameNode将fsimage.chkpoint命名为fsimage。
当然在有了HA后,也很少应用SecondaryName了。
3 平安模式
后面讲了,当NameNode启动后,首先是将FsImage和Edits文件退出内存,这个是为保障失去最新的元数据,这个其实也是合并,之后生成一个新的FsImage和一个空白的Edits,而后启动IPC Server服务,监听DataNode的申请,在这个期间,NameNode的文件系统对外界处于只读状态,也就是平安模式。
之后DataNode启动,在各个DataNode通过NameNode的IPCServer 发送他们最新的块列表信息。
当达到dfs.replication.min 设定的值,NameNode会退出平安模式,这个参数设置的值就是最小正本条件,指的是文件系统中块满足的最小正本级别。