HDFS-Namenode运行机制

Namenode运行机制

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

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

由于集群一般不会停,长时间运行会导致操作日志文件非常大,在启动的时候,需要花很长时间读取操作日志文件,合并到镜像文件中,会导致集群启动非常慢。
为了解决这个问题,因此引入了secondary namenode进程,用于定期将操作日志合并到最新的镜像文件中。本文中也多次提到secondary namenode,后面博文中会详细讲解 secondary namenode工作机制。

如果对博文感兴趣,点个赞,点个关注啥的,大家的支持是我坚持的动力;也可以加我qq讨论239821429.

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值