NameNode在hdfs当中发挥了重要角色,可以说,无NameNode,无Hdfs。

NameNode主要有俩个作用:
1.与客户端进行交互
2.维护目录树即元数据的管理

一. 元数据管理

namenode对数据的管理采用了三种存储形式:
----a内存元数据(NameSystem)
----b磁盘元数据镜像文件
----c数据操作日志文件(可通过日志运算出元数据)

1.元数据存储机制

1.内存中有一份完整的元数据(meta data) 内存大小128G
2.磁盘中有一个元数据镜像fsimage文件(位于tmp/name/current/)

hdfsnamenode 可以有三个吗 在hdfs中存在namenode_hdfs


3.Note:

meta data和fsimage位于不同介质中,那么fsimage的更新速度有可能跟不上meta data。因此需要edits进行二者的衔接。

当客户端对hdfs文件操作(查看除外)操作记录会被记录在edits,当操作成功后,才会被更新到meta data中。

每个Block占元数据大小为150字节,因此,Hdfs更适合大文件存储

过程详解

hdfsnamenode 可以有三个吗 在hdfs中存在namenode_元数据_02

1.第一阶段NameNode

(1).第一次启动NameNode 格式化后,自动创建tmp文件夹包含fsimage和edits文件 ,若不是第一次,NameNode直接加载edits和fsimage到内存

(2) 客户端对元数据增删改操作请求开始后

(3)NameNode记录操作日志,更新滚动日志
eg:

删除hdfs的一个文件 ldd

hdfsnamenode 可以有三个吗 在hdfs中存在namenode_hdfs_03

查看日志,发现有被删除的记录
[root@l4 current]# hdfs oev -p xml -i edits_inprogress_0000000000000000033 -o e1.xml

hdfsnamenode 可以有三个吗 在hdfs中存在namenode_hdfs_04

滚动日志

hdfsnamenode 可以有三个吗 在hdfs中存在namenode_xml_05

滚动后的edits_inprogress_0000000000000000038日志为空:

hdfsnamenode 可以有三个吗 在hdfs中存在namenode_元数据_06

(4)NameNode在内存中对数据进行操作

第二阶段Secondary NameNode

(1) Secondary NameNode 向NameNode发出询问,是否需要checkpoint
(2)NameNode 请求执行checkpoint
(3) NameNode 滚动当前正在写的日志,此过程如上述图中过程,NameNode一旦滚动日志(相当于打个断点)后,会生成俩个文件:
1.一个edits_inprogress 这是个空文件,2之前删除操作生成的edits文件.
(4) 将所有的edits文件 和fsimage 一起copy到Secondary NameNode.
(5) Secondary NameNode加载edits和fsimage到内存并合并
(6) 生成新的fsimage.checkpoint
(7)将新的fsimage copy到NameNode
(8) 将新的fsimage.checkpoint 重命名为fsimage

思考:1fsimage里面其实并没有记录文件块具体在某个dataNode?

其实就是为了位置dataNode挂掉 , datanode启动后直接向其汇报,直接才内存中 如果datanode挂掉,直接在内存中修改,不需要修改文件.

hdfsnamenode 可以有三个吗 在hdfs中存在namenode_xml_07

2.NameNode如何确定下次启动合并哪些edits?

NameNode会查看在seen_txide(edits_inprogress) 和最新的fsimage进行合并

hdfsnamenode 可以有三个吗 在hdfs中存在namenode_元数据_08

元数据的checkpoint

由于NameNode对每次增删改操作都会记录在edits,那么势必会导致edits过量。因此需要Seconda NameNode check point. 向Namenode发出合并的请求。

hdfsnamenode 可以有三个吗 在hdfs中存在namenode_xml_09


checkpoint操作的触发条件配置参数

dfs.namenode.checkpoint.check.period=60 #检查触发条件是否满足的频率,60秒
dfs.namenode.checkpoint.dir=file://KaTeX parse error: Expected 'EOF', got '#' at position 36: …/namesecondary #̲以上两个参数做checkpoi…{dfs.namenode.checkpoint.dir}
dfs.namenode.checkpoint.max-retries=3 #最大重试次数
dfs.namenode.checkpoint.period=3600 #两次checkpoint之间的时间间隔3600秒
dfs.namenode.checkpoint.txns=1000000 #两次checkpoint之间最大的操作记录

NameNode故障排除

方法一: 将SeconddaryNameNode 中数据拷贝到NameNode存储数据的目录:

1.KIll -9 namenode进程
2.删除Namenode存储数据

hdfsnamenode 可以有三个吗 在hdfs中存在namenode_hdfsnamenode 可以有三个吗_10

3.拷贝SecondaryNamnode中的数据到源Namnode存储数据目录中

hdfsnamenode 可以有三个吗 在hdfs中存在namenode_xml_11

4.重新启动namenode

hdfsnamenode 可以有三个吗 在hdfs中存在namenode_hdfs_12

方法二: 使用-importCheckpoint 选项启动Namnode守护进程,从而将SecondaryNameNode中的数据拷贝到NameNode目录中

1修改hdfs-site.xml 文件

hdfsnamenode 可以有三个吗 在hdfs中存在namenode_xml_13


2.kill NameNode进程

3.删除tmp/dfs/name下的文件,需要和Secondary NameNode在平级目录,删除掉 in_use_lock文件

之后运行命令:

hdfs namenode -importCheckpoint(等一会 ctrl +c关掉)

4 重启完成!