(1)第一次启动NameNode格式化后,创建Fsimage和Edits文件。如果不是第一次启动,直接加载编辑日志和镜像文件到内存。
(2)客户端对元数据进行增删改的请求。
(3)NameNode记录操作日志,更新滚动日志。
(4)NameNode在内存中对数据进行增删改。
(1)Secondary NameNode询问NameNode是否需要CheckPoint。直接带回NameNode是否检查结果。
(2)Secondary NameNode请求执行CheckPoint。
(3)NameNode滚动正在写的Edits日志。再生成一个新的edits,之后的操作就记录在新的edit当中
(4)将滚动前的编辑日志和镜像文件拷贝到Secondary NameNode。
(5)Secondary NameNode加载编辑日志和镜像文件到内存,并合并。
(6)生成新的镜像文件fsimage.chkpoint。
(7)拷贝fsimage.chkpoint到NameNode。
(8)NameNode将fsimage.chkpoint重新命名成fsimage。
Fsimage:NameNode内存中元数据序列化后形成的文件。
Edits:记录客户端更新元数据信息的每一步操作(可通过Edits运算出元数据)。
NameNode启动时,先滚动Edits并生成一个空的edits.inprogress,然后加载Edits和Fsimage到内存中,此时NameNode内存就持有最新的元数据信息。Client开始对NameNode发送元数据的增删改的请求,这些请求的操作首先会被记录到edits.inprogress中(查询元数据的操作不会被记录在Edits中,因为查询操作不会更改元数据信息),如果此时NameNode挂掉,重启后会从Edits中读取元数据的信息。然后,NameNode会在内存中执行元数据的增删改的操作。
由于Edits中记录的操作会越来越多,Edits文件会越来越大,导致NameNode在启动加载Edits时会很慢,所以需要对Edits和Fsimage进行合并(所谓合并,就是将Edits和Fsimage加载到内存中,照着Edits中的操作一步步执行,最终形成新的Fsimage)。SecondaryNameNode的作用就是帮助NameNode进行Edits和Fsimage的合并工作。
SecondaryNameNode首先会询问NameNode是否需要CheckPoint(触发CheckPoint需要满足两个条件中的任意一个,定时时间到和Edits中数据写满了)。直接带回NameNode是否检查结果。SecondaryNameNode执行CheckPoint操作,首先会让NameNode滚动Edits并生成一个空的edits.inprogress,滚动Edits的目的是给Edits打个标记,以后所有新的操作都写入edits.inprogress,其他未合并的Edits和Fsimage会拷贝到SecondaryNameNode的本地,然后将拷贝的Edits和Fsimage加载到内存中进行合并,生成fsimage.chkpoint,然后将fsimage.chkpoint拷贝给NameNode,重命名为Fsimage后替换掉原来的Fsimage。NameNode在启动时就只需要加载之前未合并的Edits和Fsimage即可,因为合并过的Edits中的元数据信息已经被记录在Fsimage中。
不能,因为NN交给2NN合并fsimage和edits时,NN自己又生成了新的edits,2NN在合并的同时,NN这个时间段的操作是记录在这个新的edits当中,2NN中不会有这个新的edits,所以不能顶替NN工作。NN中那个旧的edits文件不会删除,而是在data中保存着。fsimage则会在data中保留两个文件,一个是最新的fsimage,一个是第二新的,其他的都会删除
namenode主要负责元数据的存储,元数据存储在fsiamge文件+edits文件中!
fsimage(元数据的快照文件)
edits(记录所有写操作的文件)
NN负责集群中所有客户端的请求和所有DN的请求!在一个集群中,通常NN需要一个高配置,保证NN
可以及时处理客户端或DN的请求,一旦NN无法及时处理请求,HDFS就已经瘫痪!
①第一次格式化NN时,此时会创建NN工作的目录,其次在目录中生成一个fsimage_000000000000文件
②当NN在启动时,NN会将所有的edits文件和fsiamge文件加载到内存合并得到最新的元数据,将元数据持久化到磁盘生成新的fsimage文件
③如果启用了2nn,2nn也会辅助NN合并元数据,会将合并后的元数据发送到NN
NN在启动之后,每次接收的写操作请求,都会将写命令记录到edits文件中,edits文件每间隔一定的时间和大小滚动!
每次写操作命令,分解为若干步,每一步都会有一个id,这个id称为txid!
①inodes : 记录在fsimage文件中或edits文件中
②blocklist: 块的位置信息(每次DN在启动后,自动上报的)
1.NN在启动时,当NN将所有的元数据加载完成后,等待DN来上报块的信息
当NN中所保存的所有块的最小副本数(默认为1) / 块的总数 > 99.99%时,NN会自动离开安全模式!
在安全模式,客户端只能进行有限读操作!不能写!
1. NN主要负责元数据的存储
2. 两种存储的文件格式
edits: 在NN启动后,保存新写入的命令
fsimage: 在合并了edits和fsimage文件后,将新的元数据持久化到新的fsimage文件中
合并的时机: 需要满足checkpoint的条件
①默认1h
②两次checkpoint期间已经额外产生了100w txid的数据
3. 存储的元数据分为两种
①inodes : 记录文件的属性和文件由哪些块组成,记录到edits和fsimage文件中
②块的位置映射信息: 由NN启动后,接收DN的上报,动态生成!
4. NN的启动过程
①先加载fsimage_000000xx文件
②将fsimage文件xx之后的edits文件加载
③合并生成最新的元数据,记录checkpoint,如果满足要求,执行saveNamespace操作,不满足等满足后执行
saveNamespace操作必须在安全模式执行
④自动进入安全模式,等待DN上报块
DN上报的块的最小副本数总和 / 块的总数 > 0.999,自动在30s离开安全模式!
安全模式只能有限读,不能写!