1 NN和2NN的作用概述
NameNode (nn)
:就是Master
,它是一个主管、管理者- 管理
HDFS
的名称空间 - 配置副本策略
- 管理数据块(
Block
)映射信息 - 处理客户端读写请求
- 管理
Secondary NameNode
:并非NameNode
的热备。当NameNode
挂掉的时候,它并不能马上替换NameNode
并提供服务- 辅助
NameNode
,分担其工作量,比如定期合并fsimage
和fdits
,并推送给NameNode
- 在紧急情况下,可辅助恢复
NameNode
- 辅助
fsimage
: 它是在NameNode
启动时对整个文件系统的快照
edit
:它是在NameNode
启动后,对文件系统的改动序列
2 基本原理
NameNode
存储目录树的信息,而目录树的信息则存放在fsimage
文件中,当NameNode
启动的时候会首先读取整个fsimage
文件,将信息装载到内存中edits
文件存储日志信息,在NameNode
上所有对目录的操作,增加,删除,修改等都会保存到edits
文件中,并不会同步到fsimage
中,当NameNode
关闭的时候,也不会将fsimage
和edits
进行合并
客户端的操作首先是写入到
edits
文件中,然后再进行操作内存中的数据
- 所以当
NameNode
启动的时候,首先装载fsimage
文件,然后按照edits
中的记录执行一遍所有记录的操作,最后把信息的目录树写入fsimage
中,并删掉edits
文件,重新启用新的edits
文件 - 如果该合并过程只由
NameNode
去做,那么就会增加NameNode
的压力,因为不仅需要处理合并还要处理客户端的请求 - 基于上述
NameNode
中fsimage
和edits
合并只在NameNode
启动的时候才会进行,但是生产环境下,重启NameNode
的时候edits
往往非常大,而edits
中保存的是操作相关的,往往也存在许多重复性操作,意味着做无用功且损耗效率 Secondary NameNode
的职责分担NameNode
的压力,按一定规则合并NameNode
的edits
到fsimage
文件中。并且合并过程不影响NameNode
的操作- 合并合并规则:
- 设置了定时,定时时间到请求相关文件并进行合并
edits
文件的"数据满了",例如达到一定的操作次数
以下详细介绍二者工作机制以
3 NN元数据信息维护到哪里?
- 如果考虑数据的可靠性,需要将元数据维护到磁盘.带来的问题是对磁盘的数据修改效率低
- 如果考虑数据访问和修改的效率,需要将元数据维护到内存。带来的问题是数据不可靠
- 综合考虑:磁盘+内存
4 数据同时维护到磁盘和内存带来的问题
4.1 如何保证内存和磁盘数据的同步
问题描述:因为数据的可靠性需要将数据写入到磁盘中,考虑到操作数据的效率就需要将数据写入到内存中,最终将内存的数据写入到磁盘中,那么二者如果不同步的话,就会存在数据丢失以及重复写数据的可能性
方案: 在内存中维护元数据,且在磁盘中通过fsimage(镜像文件)
来维护元数据,并且通过edits(编辑日志)
文件记录对元数据的修改操作,记录的方式为文件末尾追加操作。元数据信息可以存在内存中,fsimage(镜像文件)
和edits(编辑日志)
存在磁盘上,对数据的操作直接追加到edits
文件末尾,这比随机写入要快很多
4.2 edits文件中记录的操作越来越多怎么办?
问题描述:fsimage
和edits
合并只在NameNode
启动的时候才会进行,如果NameNode
死机,那么在生产环境,重启NameNode
的时候edits
往往非常大,而edits
中保存的是操作相关的,往往也存在许多重复性操作,意味着做无用功且损耗效率
方案:Secondary NameNode
帮助NameNode
合并文件
5 Secondary NameNode工作过程
Secondary NameNode
请求是否需要CheckPoint
(也就是合并的相关文件的构成),NameNode
回复执行Secondary NameNode
通知NameNode
准备提交edits
文件,假设此时的编辑日志文件是edits_inprogress_001
,所有的客户端的操作首先追加到该日志中,当NameNode
提交edits
日志文件的时候该日志就定格为edits_001
,滚动产生产生edits_inprogress_002
,并将它提交给Secondary NameNode
,新的操作信息存到新的日志文件中SecondaryNameNode
通过http get
方式获取NameNode
的fsimage
与edits
文件(在Secondary NameNode
的current
同级目录下可见到temp.check-point
或者previous-checkpoint
目录,这些目录中存储着从NameNode
拷贝来的镜像文件)
3.Secondary NameNode
开始合并获取的上述两个文件,产生一个新的fsimage
文件fsimage.ckpt
Secondary NameNode
用http post
方式发送fsimage.ckpt
至NameNode
。
NameNode
将fsimage.ckpt
与edits.new
文件分别重命名为fsimage
与edits
,然后更新fstime
,整个checkpoint
过程到此结束
6 fsimages和edits文件
6.1 文件简述
NameNode
被格式化后会在指定的NameNode
数据存储目录中,该目录在hdfs-site.xml
指定,如下
在该目录下name/current
文件夹下会产生以下文件
-
fsimage
文件:HDFS
文件系统元数据的一个永久性的检查点,其中包含HDFS
文件系统的所有目录和文件inode
的序列化信息。上图中存在两个版本的fsimages,后缀分别为1570
和1572
,1570
为上一次合并的fsimages
文件,1572
表示是当前的 -
edits
文件:存放HDFS
文件系统的所有更新操作的路径,文件系统客户端执行的所有写操作首先会被记录到edits
文件中。当前的日志文件都在上述目录中当前日志是edits_inprogress_0000000000000001573
。历史日志文件后的数字范围表示的是数字是操作的次数,例如edits_001-edits_101
表示做了100
次操作
-
seen_txid
文件保存的是一个数字,就是最后一个edits
_的数字,如当前可以看到是edits_inprogress_0000000000000001573
,也就是1573
-
每次
NameNode
启动的时候都会将fsimage
文件读入内存,加载edits
里面的更新操作,保证内存中的元数据信息是最新的、同步的,可以看成NameNode
启动的时候就将fsimage
和edits
文件进行了合并
6.2 文件查看
6.2.1 格式化选项
oiv
:格式化输出fsimagesoev
:格式化输出edits
#以XML的格式输出fsimage_0000000000000000975为当前目录下的fsimage.xml
hdfs oiv -p XML -i fsimage_0000000000000000975 -o ./fsimage.xml
#以XML的格式输出edits_0000000000000000130-0000000000000000237为当前目录下的edits .xml
hdfs oev -p XML -i edits_0000000000000000130-0000000000000000237 -o ./edits .xml
6.2.2 元数据简述
fsimages文件中保存的是元数据信息,他包括了文件系统的目录结构,HDFS中文件目录是不实际在服务器创建对应的文件夹的,而是以元数据进行保存,上述格式化输出fsimages.xml文件,内容部分如下:
- 如上图中,每一个
inode
表示一个文件的元数据信息,包括inode
的id以及类型,类型是由上述的type
标签进行指定以及通过name
标签指定他的名称,block
指定他的块以及修改时间等信息
inode
是单个文件或目录的元数据信息,他从层次关系是通过id进行实现的,也就是哪个目录下边存在什么文件
parent
表示是父节点的id
,child
表示子节点的id
,这样表示一个层次的关系- 该数据结构中存在块的
id
信息,但是不能存在块是存在哪个DataNode
上边的,当设置的副本数小于服务器节点数,就会按一定策略进行选择副本去存储。这个数据块及其存储的服务器信息,是在NameNode启动的时候由DataNode
进行提交到NameNode
的内存中的
6.2.3 edits操作信息
7 CheckPoint参数设置
Secondary NameNode
可以定时或者到达一定的数据量(操作次数)就会去进行合并fsimages
和edits
文件,这个是可以在hdfs-site.xml
文件进行配置的
<property>
<name>fs.checkpoint.period</name>
<value>3600</value>
<description>每3600秒进行一次合并</description>
</property>
<property>
<name>dfs.namenode.checkpoint.txns</name>
<value>1000000</value>
<description>操作动作次数达到1000000次进行合并</description>
</property>
<property>
<name>dfs.namenode.checkpoint.check.period</name>
<value>60</value>
<description> 1分钟检查一次操作次数是否达到配置的值</description>
</property>
8 NameNode故障处理
NameNode
故障后,可以通过如下方法进行处理:将Secondary NameNode
中数据拷贝到NameNode
存储数据的目录。过程如下:
- 首先强制清除NameNode进行:
shell kill -9 NameNode进程
- 通过
rm -rf
删除NameNode存储的数据,存储的位置可以在``hdfs-site.xml进行查看:
rm -rf /opt/module/hadoop3.1.3/data/name`
- 可以通过scp命令进行拷贝
Secondary NameNode
下上述配置的目录到NameNode中
#递归拷贝目录
scp -r 2NN上的name目录 NN上的name目录
scp -r cxj@hadoop103:/opt/module/hadoop3.1.3/data/name、* ./name/
Secondary NameNode
可以恢复绝大部分数据,跟NameNode
主要差异,就是Secondary NameNode
中没有NameNode
最新的编辑日志,因为编辑日志是按一定规则进行提交合并的,不符合条件的edits
文件就存在于NameNode
中,所以如果服务器出现问题需要进行NameNode的恢复,那么通过Secondary NameNode
不一定可以完全恢复所有的数据
上述故障恢复做一个了解,目前使用的是HA
的架构,会创建多个NameNode
,当发生故障会自动切换到其他可用的NameNode
9 集群安全模式
9.1 集群安全模式概念
NaneNode
启动
NameNode
启动时,首先将镜像文件(fsimage
) 载入内存,并执行编辑日志(edits
) 中的各项操作。一旦在内存中成功建立文件系统元数据的映像,则创建一个新的fsimage
文件和一个空的编辑日志。此时NameNode
开始监听DataNode
请求。这个过程期间,NameNode
一直运行在安全 模式,即NameNode
的文件系统对于客户端未说是只读的DataNode
启动
系统中的数据块的位置并不是由NameNode
维护的,而是以块列表的形式存储在DataNode
中。在系统的正常操作期间,NameNode
会在内存中保留所有块位置的映射信息。在安全模式下,各个DataNode
会向NameNode
发送最新的块列表信息,NameNode
了解到足够多的块位置信息之后,即可高效运行文件系統- 安全模式退出判断
如果满足“最小副本条件”,NameNode
会在30秒钟
之后就退出安全模式。所谓的最小副本条件指的是在整个文件系统中99.9%
的块满足最小副本级别(默认值:dfs replication.min=1
),也就是知道每个块至少一个副本就可以正常启动或者在启动一个刚刚格式化的HDFS
集群时,因为系统中还没有任何块,所以NameNode
不会进 入安全模式
集群进入安全模式的时候,不能正常操作,例如不能正常修改
HDFS
上的文件。
上述可以在Web
端可以看到该字段,Safemode
为off表示关闭
9.2 集群安全模式操作
#获取安全模式状态
hdfs dfsadmin -safemode get
#开启安全模式
hdfs dfsadmin -safemode enter
##关闭安全模式
hdfs dfsadmin -safemode leave
#等待安全模式关闭,一般用在脚本中
hdfs dfsadmin -safemode wait
#wait实例:编写safe.sh脚本如下
hdfs dfsadmin -safemode wait
echo "Hello World"
- 在安全模式关闭的情况下直接执行以上脚本会直接输出
Hello World
- 如果执行上述脚本的时候处于安全模式,那么整个命令行会处于一个阻塞的状态,可以通过其他的服务器关闭安全模式,在执行脚本的服务器就会解除阻塞状态并输出
Hello World
10 NameNode多目录配置
多个
NameNode
存储目录保证NameNode
的可靠性,但是理论上而言应该NameNode
的存储目录要分配在不同的磁盘上,因为NameNode
相关的存储放在一台服务器上的一个磁盘意义并不大,如下仅仅是在hdfs-site.xml
中指定了一个目录
- 多目录文件配置,在
hdfs-site.xml
文件中只需要配置多个目录即可
- 磁盘挂载
临时挂载(重启服务器后消失消失)
#将name1目录挂载到/dev/sda1磁盘分区上以及将name2 目录挂载到/dev/sdb1上
mount /dev/sda1 ./name1
mount /dev/sdb1 ./name2
永久挂载
vim /etc/fstab
磁盘类型是看当初格式化磁盘的时候设置的,可以通过
lsblk -f
查看
- 配置好后使用输入
mount -a
命令自动挂载