第一篇学习了Hadoop大数据平台的基础概念
第二篇学习了Hadoop的HDFS相关理论知识和工作流程
本期继续深挖HDFS,学习一下NameNode的工作机制
概述
NameNode
HDFS的核心服务,管理和维护着整个HDFS,主要有以下作用:
负责接收客户端的操作请求;
负责管理文件系统命名空间(NameSpace)、集群配置信息及存储块的复制等;
负责文件目录树的维护以及文件对于BLOCK列表的维护;
负责管理Block与DataNode之间的关系;
SecondaryNameNode
负责合并NameNode的Edits到FsImage文件中,来保证NameNode中数据的可靠性。
工作流程

第一阶段 NameNode启动
第一次NameNode格式化启动之后,首次会创建FsImage文件和Edits文件。非第一次启动,直接加载Fsimage文件和Edits文件到内存中;
客户端对元数据执行增删改查操作,并记录到Edits文件中;
NameNode记录操作日志;
NameNode在内存中对数据进行增删改查;
第二阶段 SecondaryNameNode启动
询问NameNode是否需要CheckPoint,NameNode返回信息;
NameNode切割现有日志文件,新记录滚动写入新Edits文件;
拷贝FsImage文件和旧的Edits文件到SNN节点,可能有多个文件
SNN加载FsImage文件和Edits文件到内存中合并;
生产新的FsImage文件;
将新生成的FsImage文件拷贝到NameNode;
NameNode将新生成的FsImage文件重命名替换旧的FsImage文件;
CheckPoint
CheckPoint节点通常运行在与NameNode不同的机器上。
SecondaryNameNode 定期从Active NameNode上将Edits文件和FsImage文件下载到本地,并加载到内存进行合并。这个合并过程称为一个检查点(CheckPoint)。
在 NameNode 运行期间,HDFS 的所有变更操作都是写到 Edits 文件中。一段时间后,Edits 文件会变得非常大。CheckPoint 的出现就是解决 Edits 文件不断变大的问题,并将 Edits 文件大小保持在限制范围内。
NameNode 和 SecondaryNameNode 的数据目录存储结构完全相同。
当单节点集群下 NameNode 故障需要重新恢复时,可以从 SecondaryNameNode 的数据目录中将 FsImage 和 Edits 所有文件拷贝到 NameNode 的数据目录,以恢复 NameNode 的元数据。但只能恢复大部分数据,因为有些数据可能还没做 CheckPoint。
通过修改 【hdfs-default.xml】 文件的相关配置,设置CheckPoint检查时间参数
<property><name>dfs.namenode.checkpoint.period</name><value>3600</value><description>每隔3600秒 checkpoint 一次</description></property><property><name>dfs.namenode.checkpoint.txns</name><value>1000000</value><description>操作次数达到 100万 次 checkpoint 一次</description></property><property><name>dfs.namenode.checkpoint.check.period</name><value>60</value><description>每隔60秒检查一次操作次数是否达到</description></property>
dfs.namenode.checkpoint.period 和 dfs.namenode.checkpoint.txns 这两个参数只要任意满足于其中一个,都会触发 CheckPoint。
由于 CheckPoint 的过程需要消耗大量的 IO 和 CPU 资源,并且会阻塞 HDFS 的读写操作。所以,该过程不会在 NameNode 节点上触发。
文件信息
概念
NameNode中包含FsImage 和 Edits两个文件
NameNode被格式化之后,将在{data_dir}/tmp/dfs/name/current目录中产生如下文件
edits_0000000000000000000fsimage_0000000000000000000.md5seen_txid
FsImage
命名空间镜像文件,记录数据块到文件的映射、目录或文件的结构、属性等信息。
Edits
操作日志文件,记录对所有文件的创建、删除、重命名等操作日志。
seen_txid
seen_txid文件保存的是一个数字,就是最后一个edits_的数字。记录了最后一次 CheckPoint 或者 edit 回滚(将 edits_inprogress_xxx 文件回滚成一个新的 Edits 文件)之后的 transaction ID。主要用来检查 NameNode 启动过程中 Edits 文件是否有丢失的情况。
每次Namenode启动的时候都会将fsimage文件读入内存,并从00001开始到seen_txid中记录的数字依次执行每个edits里面的更新操作,保证内存中的元数据信息是最新的、同步的,可以看成Namenode启动的时候就将fsimage和edits文件进行了合并。
文件查看
查看FsImage文件
hdfs oiv -p 文件类型 -i镜像文件 -o 转换后文件输出路径
-i 要转换的文件
-o 转换后的文件路径
-p 转换格式(XML|FileDistribution|ReverseXML|Web|Delimited)
查看Edits文件
hdfs oev -p 文件类型 -i操作日志文件 -o 转换后文件输出路径
-i 要转换的文件
-o 转换后的文件路径
-p 转换格式:binary(hadoop 二进制格式), xml(默认 XML 格式), stats(打印关于编辑文件的统计信息)
故障恢复
NameNode故障后,有两种方法恢复数据。
拷贝SecondaryNameNode数据
将SecondaryNameNode中数据拷贝到NameNode存储数据的目录
1.
kill -9 namenode进程
2.
删除namenode存储数据(~/data/tmp/dfs/name)
$ rm -rf ~/data/tmp/dfs/name/*
3.
拷贝SecondaryNameNode中数据到原namenode存储数据目录
[dfs]$ scp -r xx@hadoop04:/opt/module/hadoop-3.3.6/data/tmp/dfs/namesecondary/* ./name/
4.
重新启动namenode
sbin/hadoop-daemon.sh start namenode
CheckPoint机制
修改hdfs-site.xml
<property><name>dfs.namenode.checkpoint.period</name><value>120</value></property><property><name>dfs.namenode.name.dir</name><value>/opt/module/hadoop-3.3.6/data/tmp/dfs/name</value></property>
小结
1.
kill -9 namenode进程
2.
删除namenode存储数据(~/data/tmp/dfs/name)
3.
如果SecondaryNameNode不和Namenode在一个主机节点上,需要将SecondaryNameNode存储数据的目录拷贝到Namenode存储数据的平级目录,并删除in_use.lock文件。
[xx@hadoop02 dfs]$ scp -r xx@hadoop04:/opt/module/hadoop-3.3.6/data/tmp/dfs/namesecondary ./[xx@hadoop02 namesecondary]$ rm -rf in_use.lock[xx@hadoop02 dfs]$ pwd/opt/module/hadoop-3.3.6/data/tmp/dfs[xx@hadoop02 dfs]$ lsdata name namesecondary
4.
导入检查点数据(等待一会ctrl+c结束掉)
bin/hdfs namenode -importCheckpoint
5.
启动namenode
多个目录配置
NameNode的本地目录可以配置成多个,且每个目录存放内容相同,增加了可靠性。
添加配置
# vim opt/hadoop2.7/etc/hadoop/hdfs-site.xml# 添加内容如下<property><name>dfs.namenode.name.dir</name><value>file:///${hadoop.tmp.dir}/dfs/name01,file:///${hadoop.tmp.dir}/dfs/name02</value></property>
删除原有数据
集群下所有服务都需要执行该操作;
[hadoop3.3.6]# rm -rf data/ logs/
格式化集群并启动
[hadoop3.3.6]# bin/hdfs namenode –format[hadoop3.3.6]# sbin/start-dfs.sh
集群安全模式
概述
Namenode启动时,首先将映像文件(fsimage)载入内存,并执行编辑日志(edits)中的各项操作。一旦在内存中成功建立文件系统元数据的映像,则创建一个新的fsimage文件和一个空的编辑日志。此时,namenode开始监听datanode请求。但是此刻,namenode运行在安全模式,即namenode的文件系统对于客户端来说是只读的。
系统中的数据块的位置并不是由namenode维护的,而是以块列表的形式存储在datanode中。在系统的正常操作期间,namenode会在内存中保留所有块位置的映射信息。在安全模式下,各个datanode会向namenode发送最新的块列表信息,namenode了解到足够多的块位置信息之后,即可高效运行文件系统。
如果满足“最小副本条件”,namenode会在30秒钟之后就退出安全模式。所谓的最小副本条件指的是在整个文件系统中99.9%的块满足最小副本级别(默认值:dfs.replication.min=1)。在启动一个刚刚格式化的HDFS集群时,因为系统中还没有任何块,所以namenode不会进入安全模式。
基本语法
集群处于安全模式,不能执行重要操作(写操作)。集群启动完成后,自动退出安全模式。
bin/hdfs dfsadmin -safemode get (功能描述:查看安全模式状态)
bin/hdfs dfsadmin -safemode enter (功能描述:进入安全模式状态)
bin/hdfs dfsadmin -safemode leave (功能描述:离开安全模式状态)
bin/hdfs dfsadmin -safemode wait (功能描述:等待安全模式状态)




