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
hdfs oiv -p XML -i fsimage_0000000000000000975 -o ./fsimage.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
hdfs dfsadmin -safemode wait
echo "Hello World"
- 在安全模式关闭的情况下直接执行以上脚本会直接输出
Hello World - 如果执行上述脚本的时候处于安全模式,那么整个命令行会处于一个阻塞的状态,可以通过其他的服务器关闭安全模式,在执行脚本的服务器就会解除阻塞状态并输出
Hello World
10 NameNode多目录配置
多个NameNode 存储目录保证NameNode 的可靠性,但是理论上而言应该NameNode 的存储目录要分配在不同的磁盘上,因为NameNode 相关的存储放在一台服务器上的一个磁盘意义并不大,如下仅仅是在hdfs-site.xml 中指定了一个目录
- 多目录文件配置,在
hdfs-site.xml 文件中只需要配置多个目录即可 - 磁盘挂载
临时挂载(重启服务器后消失消失)
mount /dev/sda1 ./name1
mount /dev/sdb1 ./name2
永久挂载
vim /etc/fstab
磁盘类型是看当初格式化磁盘的时候设置的,可以通过lsblk -f 查看
- 配置好后使用输入
mount -a 命令自动挂载
|