Namenode运行机制
namenode运行机制是HDFS非常重要,核心的知识点。搞清楚namenode运行机制这篇文章就够了,希望对大家有所帮助。
目录
- Namenode运行机制
- 1.Namenode的结构
- 1.1内存
- 1.2 磁盘
- 2.从数据读写的过程理解namenode的工作机制
- 3.Namenode启动过程
- 4.面临的问题
1.Namenode的结构
Namenode的目录结构粗线条的来分,包括内存和磁盘。那么内存和磁盘里面分别存储的什么信息,它们之间是如何配合?
1.1内存
1.内存的大小
在hadoop-env.sh配置文件中可以配置,默认是1g。所以namenode所在的节点内存不能小于1g。
2.查看当前集群的namenode内存大小
(1)查看namenode的进程id,命令:jps
(2)查看namenode进程的参数:ps -f 2813 | more
3.内存存储的信息
根据FSNamesystem API描述,在namenode中需要保存下面4种信息,简单点理解就是存储一个文件的系统的目录结构树。namenode需要在内存中维护这样的一个最新目录树,用于返回给客户请求对应的节点和块信息。
*1) Set of all valid blocks (inverted #1)
*2) block --> machinelist (keptin memory, rebuilt dynamically from reports)
*3) machine --> blocklist(inverted #2)
*4) LRU cache of updated-heartbeatmachines
1.2 磁盘
1.包含的文件信息
存储的路径为:/hadoop/data/dfs/name/current
磁盘包含的文件信息如下:
2.磁盘文件信息的说明【重要】
可以看到nameNode存储的磁盘信息,主要包括如下:
- edits开头的文件
- edits_inprogress开头的文件
- fsimage开头的文件
- fsimage开头,md5结尾的文件
- seen_txid 文件
(1).磁盘文件信息的作用
那么为什么要存储这些文件,存储这些文件的作用是什么?
作用:将内存中保存的文件系统目录树持久化到磁盘,避免内存中系统目录树数据丢失,也就是内存中的数据等于edits文件(操作日志文件)+fsimage(镜像文件)。我们知道对于集群来说,文件目录树丢失,那么基本宣告集群崩溃,这是一个无法接受的结果。那么namenode本地磁盘持久化是防止内存数据丢失的手段之一。
(2)磁盘文件的命名规则
规则一:edis文件、edits_inprogress文件和fsimage文件以事务id结尾
edits文件和edits_inprogress文件,以及fsimage文件结尾都跟了一串数字,这个数字就是集群操作的事务id,客户端发起的操作集群都会定义一个事务id,逐渐递增的。当一个集群第一次运行时,第一个事务id就是:0000000000000000001。
规则二:最新事务id记录在seen_tx.id
最新的事务id 号存储在seen_tx.id中。
规则三:edits文件 以事务开始id-事务结束id结尾
edits文件存储的是已经合并过的操作日志信息,文件名称中的事务开始id-事务结束id表示该文件记录的操作事务区间。
规则四:md5结尾的fsimage文件是校验文件
fsimage开头,md5结尾的镜像文件是fsimage文件的校验文件,用于校验fsimage是否被修改过。
2.从数据读写的过程理解namenode的工作机制
客户端请求namenode进行集群操作,namenode会从内存的目录树结构中查询客户端需要操作的文件,所在节点和块信息等返回给客户端。客户端根据namenode返回的datanode节点信息连接datanode,进行操作。Datanode主动上报操作信息给namenode,namenode将操作信息写入磁盘中的edits_inprogress文件,并保存在内存中。
特别提醒:
Namenode将操作信息写入的是edits_inprogress,不是edits 文件。edits文件在整个读写过程中,都不会参与。
那么磁盘中的edits文件是什么时候产生,在什么过程中会参与?
解答:edits文件是当secondary namenode进行合并操作时,就会生产一个 以事务id开始到事务id结束的edits,存储该次合并操作的事务id范围及事务的操作信息。此时该edits文件中的操作日志已经合并到了fsimage文件中。
3.Namenode启动过程
Namenode在启动的时候为了保证内存中的目录结构为最新的信息。会去磁盘读取edits文件和fsimage镜像文件。
提出两个问题:
(1)磁盘中的edits文件包括:edits文件和edits_inprogress文件,到底读取的是哪个文件?
(2)为什么不直接读取fsimage镜像文件,而需要读取edits文件+fsimage?
问题一:启动读取edits文件的过程
当namenode启动的时候,edits_inprogress文件会将文件中的信息刷到一个edits文件中(文件结尾为事务开始id-事务结束id,表示刷进去的事务操作范围),并生成一个最新的edits_inprogress开头的文件,文件结尾为最新的事务id。nameNode拿到这个edits文件以后,再和最新的fsimage镜像文件进行合并,生成内存中的文件系统目录结构树。
问题二:启动时读取edits+fsimage文件,而不是只读取fsimage
磁盘中的fsimage是由secondary namenode定期合并生成的最新的镜像文件,但是secondary namenode将操作日志合并到fsimage中是有周期性,在周期内,如果集群停掉,最新的日志文件就没有合并到fsimage中。
4.面临的问题
由于集群一般不会停,长时间运行会导致操作日志文件非常大,在启动的时候,需要花很长时间读取操作日志文件,合并到镜像文件中,会导致集群启动非常慢。