![[fe889daa8be54dcaa1c7cc364c7a35f5.png]]
# 一、概述
NameNode是整个文件系统的管理节点,它主要维护着整个文件系统的文件目录树,文件/目录的信息 和 每个文件对应的数据块列表,并且还负责接收用户的操作请求
### 文件目录树
表示目录之间的层级关系,就是我们在hdfs上执行ls命令可以看到的那个目录结构信息
### 文件/目录的信息
表示文件/目录的的一些基本信息,所有者 属组 修改时间 文件大小等信息
### 数据块列表
如果一个文件太大,那么在集群中存储的时候会对文件进行切割,这个时候就类似于会给文件分成一块一块的,存储到不同机器上面。所以HDFS还要记录一下一个文件到底被分了多少块,每一块都在什么地方存储着
# 二、元数据文件
+ fsimage:元数据镜像文件,存储某一时段NameNode内存元数据信息
+ edits:操作日志文件
+ seen_txid:是存放transactionId的文件,format之后是0,它代表的是namenode里面的edits_*文件的尾数,namenode重启的时候,会按照seen_txid的数字,顺序从头跑edits_0000001~到seen_txid的数字。如果根据对应的seen_txid无法加载到对应的文件,NameNode进程将不会完成启动以保护数据一致性。
+ VERSION:保存了集群的版本信息
根据hdfs-site.xml文件配置,找到dfs.namenode.name.dir属性,可以找到元数据目录$dfs.namenode.name.dir/current
![[Snipaste_2023-03-06_10-26-39 1.png]]
in_use.lock 这个只是一个普通文件,但是它其实有特殊的含义,文件名后缀值lock 表示是锁的意思,文件名是in_use 表示这个文件现在正在使用,不允许你再启动namenode。当我们启动namonde的时候 会判断这个目录下是否有in_use.lock 这个相当于一把锁,如果没有的话,才可以启动成功,启动成功之后就会加一把锁, 停止的时候会把这个锁去掉。
![[Snipaste_2023-03-06_10-26-39.png]]
## 2.1 fsimage
fsimage文件有两个文件名相同的,有一个后缀是md5,md5是一种加密算法,这个其实主要是为了做md5校验的,为了保证文件传输的过程中不出问题,相同内容的md5是一样的,所以后期如果我把这个fsimage和对应的fsimage.md5发给你 然后你根据md5对fsimage的内容进行加密,获取一个值 和fsimage.md5中的内容进行比较,如果一样,说明你接收到的文件就是完整的。
通过命令将fsimage转为xml,方便查看
```shell
hdfs oiv -p XML -i fsimage_0000000000000000056 -o fsimage56.xml
```
里面最外层是一个fsimage标签,看里面的inode标签,
这个inode表示是hdfs中的每一个目录或者文件信息
```xml
16393
FILE
LICENSE.txt
2
1586332513657
1586332513485
134217728
root:supergroup:0644
1073741827
1003
150569
0
```
id:唯一编号
type:文件类型
name:文件名称
replication:文件的副本数量
mtime:修改时间
atime:访问时间
preferredBlockSize:推荐每一个数据块的大小
permission:权限信息
blocks:包含多少数据块【文件被切成数据块】
block:内部的id表示是块id,genstamp是一个唯一编号,numBytes表示当前数据块的实际大小,storagePolicyId表示是数据的存储策略
**这个文件中其实就维护了整个文件系统的文件目录树,文件/目录的元信息和每个文件对应的数据块列表,所以说fsimage中存放了hdfs最核心的数据。**
## 2.2 edits
当我们上传大文件的时候,一个大文件会分为多个block,那么edits文件中就会记录这些block的上传状态,只有当全部block都上传成功了以后,这个时候edits中才会记录这个文件上传成功了,那么我们执行hdfs dfs -ls 的时候就能查到这个文件了,所以当我们在hdfs中执行ls命令的时候,其实会查询fsimage和edits中的内容。
查看edits文件:
```shell
hdfs oev -i edits_0000000000000000057-0000000000000000065 -o edits.xml
```
OP_ADD:执行上传操作
OP_ALLOCATE_BLOCK_ID:申请block块id
OP_SET_GENSTAMP_V2:设置GENSTAMP
OP_ADD_BLOCK:添加block块
OP_CLOSE:关闭上传操作
```xml
OP_ADD
58
0
16396
/user.txt
3
1586349095694
1586349095694
134217728
DFSClient_NONMAPREDUCE_-1768454371_1
192.168.182.1
true
yehua
supergroup
420
0
1722b83a-2dc7-4c46-baa9-9fa956b755cd
0
OP_ALLOCATE_BLOCK_ID
59
1073741830
```
每一个record都有一个事务id,txid,事务id是连续的(从58到59,正常情况下有5个步骤,所以有5个连续的txid),其实一个put操作会在edits文件中产生很多的record,对应的就是很多步骤,这些步骤对我们是屏蔽的。
## 2.3 seen_txid
![[Snipaste_2023-03-06_10-26-39 3.png]]
seen_txid文件,HDFS format之后是0,它代表的是namenode里面的edits_*文件的尾数,namenode重启的时候,会按照seen_txid的数字,顺序从头跑edits_0000001~到seen_txid的数字。如果根据对应的seen_txid无法加载到对应的文件,NameNode进程将不会完成启动以保护数据一致性。
## 2.4 VERSION
![[Snipaste_2023-03-06_10-26-39 2.png]]
# 三、SNN合并日志
edits隔一段时间就会对fsimage进行同步(合并)。edits在执行读写合并操作时,是被占用状态,整个namenode不能对外提供服务。用户一来会先找edits。这样不好。namenode是整个集群的管理和元数据记录。读写操作消耗很大。合并这件事可以定期发送给SecondaryNameNode来做。为了保证实时提供服务创建新的edits临时替代原来的edits对外提供服务。SecondaryNameNode的fsimage和edits合并后得到新的fsimage(SecondaryNameNode的edits被删除)传回给namenode,namenode的edits被清空。
![[5128967-24284b0c0ed22be3.png]]