Namenode运行机制

namenode运行机制是HDFS非常重要,核心的知识点。搞清楚namenode运行机制这篇文章就够了,希望对大家有所帮助。


目录

  • Namenode运行机制
  • 1.Namenode的结构
  • 1.1内存
  • 1.2 磁盘
  • 2.从数据读写的过程理解namenode的工作机制
  • 3.Namenode启动过程
  • 4.面临的问题


1.Namenode的结构

Namenode的目录结构粗线条的来分,包括内存和磁盘。那么内存和磁盘里面分别存储的什么信息,它们之间是如何配合?

java查看hdfs总容量和使用情况 hdfs查看namenode_运行机制

1.1内存

1.内存的大小

在hadoop-env.sh配置文件中可以配置,默认是1g。所以namenode所在的节点内存不能小于1g。

java查看hdfs总容量和使用情况 hdfs查看namenode_java查看hdfs总容量和使用情况_02


2.查看当前集群的namenode内存大小

(1)查看namenode的进程id,命令:jps

java查看hdfs总容量和使用情况 hdfs查看namenode_大数据_03


(2)查看namenode进程的参数:ps -f 2813 | more

java查看hdfs总容量和使用情况 hdfs查看namenode_大数据_04


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

磁盘包含的文件信息如下:

java查看hdfs总容量和使用情况 hdfs查看namenode_目录结构_05


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.面临的问题

由于集群一般不会停,长时间运行会导致操作日志文件非常大,在启动的时候,需要花很长时间读取操作日志文件,合并到镜像文件中,会导致集群启动非常慢。