目录
1.NameNode是什么?
NameNode是一个中心服务器,负责管理文件系统的名字空间namespace以及客户端对文件的访问。
2.NameNode做什么?
- 文件系统目录树管理
- 数据块和数据节点管理
- 租约管理,租约是Namenode给与租约持有者(客户端)在规定时间内拥有文件权限(写文件)的合同,Namenode会执行租约的发放、回收、检查以及恢复等操作。
- 缓存管理,2.3新增了集中式缓存管理功能,允许用户将文件和目录保存到HDFS缓存中。HDFS的集中式缓存是由分布在Datanode上的堆外内存组成的,并且由Namenode统一管理。
- FSNamesystem,Namenode的FSNamesystem类是用于处理HDFS操作逻辑的(读 写 追加等)
3.NameNode怎么做?
(1)格式化NameNode时,会调用FSImage的saveFSImage()和FSEditLog.createEditLogFile()用以存储当前的元数据。因此,NameNode主要维护两个文件,分别是fsimage和editlog
- fsimage:保存了最新的元数据检查点,包含整个HDFS的所有目录和所有文件的信息。对于文件而言,包括数据块的描述信息、修改时间、访问时间等;对于目录而言包括修改时间、访问权限控制信息等。简单来说,fsimage就是某个时刻的HDFS的快照,即这个时刻hdfs上所有的文件块和目录,分别的状态,位于哪个datanode,各自的权限,各自的副本个数
- editlog:记录了在NameNode启动状态下,对HDFS进行的各种更新操作,HDFS客户端执行所有的写操作都会被记录到editlog中
(2)启动/重启NameNode时,进入安全模式执行如下操作
- 会从fsimage和editlog中加载元数据信息到内存中,建立第一关系:文件系统目录树
- 接受Datanode的块汇报(blockReport),获的数据块的存储信息,建立第二关系:数据块与副本和数据节点之间的对应关系
- 当Namenode收集到的阈值比例满足最低副本系数的数据块时才可以离开安全模式。
(3)HDFS是wirte-once-read-many,且不支持客户端并行写操作,所以HDFS通过租约(Lease)机制实现文件的互斥操作
租约:NameNode给予租约持有者(LeaseHolder,一般是指客户端)在规定时间内拥有文件权限(写文件)的合同
- 客户端写文件时,需要先从租约管理器(LeaseManager)申请一个租约,申请成功后客户端成为租约持有者,拥有对HDFS文件的独占权限,其他客户端在该租约有效期间无法对该HDFS文件进行操作
- Namenode的租约管理器保存了 HDFS文件与租约、租约与租约持有者的对应关系,租约管理器还会定期检查它维护的所有租约是否过期。租约管理器会强制收回过期的租约,所以租约持有者需要定期更新租约(renew),维护对该文件的独占锁定。当客户端完成了对文件的写操作,关闭文件时,必须在租约管理器中释放租约。
4.NameNode存在什么问题?
- 由于启动或者重启NameNode时,会加载fsimage和editlog,随着时间的推移,editlog内容会越来越大,导致NameNode启动时需要耗费大量的时间
5.Secondary NameNode的引入
为了解决上述的问题,HDFS会采用checkpoing机制定期将edit log合并到fsimage中生成新的fsimage
首先,合并fsimage和editlog文件是一件非常消耗io的操作,且在进行合并的过程中肯定会有其他应用继续访问和修改HDFS文件。所以这个过程一般不在单一的NameNode节点上进行。
checkpoint的触发条件可以在core-site.xml中配置,默认配置如下
<property>
<name>fs.checkpoint.period</name>
<value>3600</value>
</property>
<property>
<name>fs.checkpoint.size</name>
<value>67108864</value>
</property>
当时间超过1小时或者当editlog日志大小超过64M时,就进行checkpoint操作。
(1)若不在HA模式下,checkpoint由SecoundaryNameNode来进行。
- 当达到checkpoint条件时,NameNode会生成edits.new文件,用于记录往后对于HDFS的更新操作
- NameNode会通过HTTP协议将edits和fsimage文件发送到SecoundaryNameNode
- SecoundaryNameNode会对edits和fsimage文件进行合并操作,生成fsimage.ckpt文件
- SecoundaryNameNode会通过HTTP协议将合并后的文件fsimage.ckpt发送给NameNode
- NameNode接收到fsimage.ckpt文件后,修改edits.new文件成edits,修改fsimage.ckpt文件成fsimage
- 往后SecoundaryNameNode会从NameNode中获取最新的edits文件,并和自己的fsimage文件合并新的fsimage文件,再发送给NameNode,重复以上操作
(2)若在HA模式下,checkpoint则由StandBy状态的NameNode来进行。
- SBNN检查达到checkpoint条件后,将该namespace以fsimage.ckpt_txid格式保存到SBNN的磁盘上,并且随之生成一个MD5文件。然后将该fsimage.ckpt_txid文件重命名为fsimage_txid。
- 然后SBNN通过HTTP联系ANN。
- ANN通过HTTP从SBNN获取最新的fsimage_txid文件并保存为fsimage.ckpt_txid,然后也生成一个MD5,将这个MD5与SBNN的MD5文件进行比较,确认ANN已经正确获取到了SBNN最新的fsimage文件。然后将fsimage.ckpt_txid文件重命名为fsimage_txit。