NameNode在hdfs当中发挥了重要角色,可以说,无NameNode,无Hdfs。
NameNode主要有俩个作用:
1.与客户端进行交互
2.维护目录树即元数据的管理
一. 元数据管理
namenode对数据的管理采用了三种存储形式:
----a内存元数据(NameSystem)
----b磁盘元数据镜像文件
----c数据操作日志文件(可通过日志运算出元数据)
1.元数据存储机制
1.内存中有一份完整的元数据(meta data) 内存大小128G
2.磁盘中有一个元数据镜像fsimage文件(位于tmp/name/current/)
3.Note:
meta data和fsimage位于不同介质中,那么fsimage的更新速度有可能跟不上meta data。因此需要edits进行二者的衔接。
当客户端对hdfs文件操作(查看除外)操作记录会被记录在edits,当操作成功后,才会被更新到meta data中。
每个Block占元数据大小为150字节,因此,Hdfs更适合大文件存储
过程详解
1.第一阶段NameNode
(1).第一次启动NameNode 格式化后,自动创建tmp文件夹包含fsimage和edits文件 ,若不是第一次,NameNode直接加载edits和fsimage到内存
(2) 客户端对元数据增删改操作请求开始后
(3)NameNode记录操作日志,更新滚动日志
eg:
删除hdfs的一个文件 ldd
查看日志,发现有被删除的记录
[root@l4 current]# hdfs oev -p xml -i edits_inprogress_0000000000000000033 -o e1.xml
滚动日志
滚动后的edits_inprogress_0000000000000000038日志为空:
(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挂掉,直接在内存中修改,不需要修改文件.
2.NameNode如何确定下次启动合并哪些edits?
NameNode会查看在seen_txide(edits_inprogress) 和最新的fsimage进行合并
元数据的checkpoint
由于NameNode对每次增删改操作都会记录在edits,那么势必会导致edits过量。因此需要Seconda NameNode check point. 向Namenode发出合并的请求。
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存储数据
3.拷贝SecondaryNamnode中的数据到源Namnode存储数据目录中
4.重新启动namenode
方法二: 使用-importCheckpoint 选项启动Namnode守护进程,从而将SecondaryNameNode中的数据拷贝到NameNode目录中
1修改hdfs-site.xml 文件
2.kill NameNode进程
3.删除tmp/dfs/name下的文件,需要和Secondary NameNode在平级目录,删除掉 in_use_lock文件
之后运行命令:
hdfs namenode -importCheckpoint(等一会 ctrl +c关掉)
4 重启完成!