小编给大家分享一下HDFS中NN和2NN工作机制的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
引入:当我们将数据上传到HDFS分布式系统进行存储时,通过NN存储HDFS系统中数据的元数据,DN存储真实数据,那NN中的
元数据存储在哪?
假设:a.考虑数据安全性和可靠性,NN中元数据存储在节点的磁盘中。
--问题:访问效率很低( 因为修改元数据是在磁盘进行修改的~IO操作)
b.考虑数据操作速率,将NN中元数据存储在内存中。
--问题:服务器宕机,停电等故障,导致元数据丢失(元数据丢失,整个集群无法工作)
问题:那该怎么实现高效操作元数据的情况下,还能实现内存+磁盘的维护方案
解决:HDFS通过备份fsimage(镜像文件) + edits(滚动编辑日志)的方案来解决问题
--fsimage:NameNode内存中元数据序列化后形成的文件
镜像文件:某个时刻对NN内存中元数据的一个快照. 镜像文件 <= NN内存中数据
--Edits:记录client改元数据信息的每一步操作(可通过Edits运算出元数据)。
Edits文件(只进行追加操作,效率很高),将对NN中元数据的操作,以日志记录的方式存入Edits文件
a.Edits文件随着操作的增加会越来越大,需要定期进行FsImage和Edits的合并
b.SecondaryNamenode(2NN)专门用于FsImage和Edits的合并.
结论:磁盘和内存中均存
NN主要操作:
--第一次启动NN格式化后,在/opt/module/hadoop-3.1.3/data/name/current下会创建fsimage和eidts文
件,如果不是第一次启动,则直接加载镜像文件和滚动编辑日志文件到内存
seen_txid:记录正在使用的编辑日志文件
1) NN启动时,需要自己先将磁盘的fsimage_current+edits001_progress 文件进行一次合并. 在内存中构建好元数据信息
2) 当对HDFS进行改操作, 首先会在edits001_progress(正在使用的编辑日志)记录对应的操作,然后对NN内存中的元数据
进行相应的修改.
3) 2NN会每隔1个小时或者当 edits001_progress中已经记录了100万次的操作后,开始进行fsimage_current 和ed
its001_progress的合并
4) NN会将edits_progress进行所谓的滚动,说白了就是该文件不能再进行写入操作,会生成另外一个编辑日志文件用
于记录后续的写操作.
滚动正在使用的编辑日志: edits001_progress --> edits001
新的编辑日志: edits002_progress
5) 2NN 将NN中的fsimage_current 和 edits001 拷贝过来。加载到内存中进行合并. 合并完成后会生成新的fsimage_new.
6) 2NN 将fsimage_new 推送到NN中, fsiamge_current --> fsimage_old 会保留,fsimage_new -->fsiamge_
current .相当于会保留一份新的fsimage 和一份旧的fsiamge.
7) 总结: NN内存中的数据 = 磁盘上正在使用的fsimage + 正在使用的edits文件.
2NN主要操作:大致流程
a.将NN机器对应磁盘上的fsimage 和 Edits文件拉取到2NN的机器中
b.在2NN的机器中将fsimage + Edits都读取到内存中进行合并,然后生成新的fsimage.chkpint
在合并时,edits日志文件会重新生成一个新的,用来记录在合并时的操作
c.再推送到NN机器中的磁盘上,重命名成fsimage,NN中旧的fsimage会保留,新的fsimage对应的
是正在使用
checkpoint时间设置:(触发条件)
a.2NN每隔1小时就发送请求给NN是否需要进行checkpoint
[hdfs-default.xml] --具体设置
<property>
<name>dfs.namenode.checkpoint.period</name>
<value>3600</value>
</property>
b.Edites文件记录操作数达到100万,进行checkpoint操作
--2nn并不知道客户端操作了多少次nn,所以设置1分钟询问nn一次
[hdfs-site.xml]添加如下配置:
<property>
<name>dfs.namenode.checkpoint.txns</name>
<value>1000000</value>
<description>操作动作次数</description>
</property>
<property>
<name>dfs.namenode.checkpoint.check.period</name>
<value>60</value>
<description> 1分钟检查一次操作次数</description>
</property >
方式一:将secondaryNameNode中的数据cp到NameNode存储数据的目录(会缺少edits_inprocess中记录的那部分数据)
--NN存储的目录(/opt/module/hadoop-3.1.3/data/name/current)
具体操作演示:
1、杀掉NameNode进程
jps 查看NN运行的进程号
kill -9 NN进程号
2、删除name下所有内容
rm -rf /opt/module/hadoop-3.1.3/data/name/*
3、拷贝2NN服务器节点name下的所有内容到NN中的name目录下
scp -r luck@swk5:/opt/module/hadoop-3.1.3/data/namesecondary/* ./name/
方式二:使用-importCheckpoint选项启动NameNode守护进程,从而将SecondaryNameNode中数据拷贝到NameNode目录中.
具体操作:
1、修改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.1.3/data/name</value>
</property>
2、kill -9 NameNode进程
3、删除NameNode存储的数据(/opt/module/hadoop-3.1.3/data/name)
4、如果2NN不和NN在一个主机节点上,需要将2NN存储数据的目录拷贝到NN存储数据的平级目录,并删除in_use.lock文件
scp -r atguigu@swk5:/opt/module/hadoop-3.1.3/data/namesecondary ./
rm -rf in_use.lock
pwd ---> /opt/module/hadoop-3.1.3/data
5、导入检查点数据(等待一会ctrl+c结束掉)
bin/hdfs namenode -importCheckpoint
6、启动NameNode
hdfs --daemon start namenode
安全模式生命周期:
1、init
当NN刚启动~加载fsimage+edites日志文件~内存中元数据构建成功~NN开始监听DN请求,此过程中,NN处于安全
模式下,NN的文件系统对于client是只读的
2、run
当DN启动~DN向NN发起内部通信,告知NN自己节点上DN真实块数据列表信息(安全模式下),NN收到各DN的块位
置信息之后,开始运行文件系统
--NN中的真实数据存放位置不是由NN维护的,而是以块的形式存储在各DN节点上
3、safe quit:(HDFS集群系统启动完成后,自动退出安全模式)
满足‘最小副本条件’ 安全模式退出
--最小副本:整个文件系统中99.9%的块满足最小副本级别(默认值:dfs.replication.min=1)
安全模式具体操作:
1、--查看安全模式状态
bin/hdfs dfsadmin -safemode get
2、--进入安全模式
bin/hdfs dfsadmin -safemode enter
3、--离开安全模式
bin/hdfs dfsadmin -safemode leave
4、--等待安全模式
bin/hdfs dfsadmin -safemode wait
案例演示:
1、在/opt/module/hadoop-3.1.3/ 路径下创建脚本safemode.sh
touch safemode.sh
2、编辑safemode.sh
sudo vim safemode.sh --内容是安全模式进入等待状态,并上传一个文件到HDFS系统
#!/bin/bash
hdfs dfsadmin -safemode wait
hdfs dfs -put /opt/module/hadoop-3.1.3/README.txt /
3、给与safemode.sh执行权限
chmod 777 safemode.sh
4、运行safemode.sh脚本
./safemode.sh
5、重新打开一个xshell控制台,执行离开等待状态
bin/hdfs dfsadmin -safemode leave
6、观察原窗口,查看原窗口hdfs的安全模式状态
bin/hdfs dfsadmin -safemode get
Safe mode is OFF
safemode.sh中的上传代码执行,hdfs集群已有上传的数据
--NN的本地目录可以配置成多个,且每个目录存放内容相同,增加了可靠性,name1和name2可以挂载到不同磁盘(linux支
持),这样就可以保证元数据的可靠性,多目录挂载单个磁盘,没有意义,磁盘坏掉,目录也就坏掉了
--生产环境中,要提前就考虑好每个NN目录要挂载的磁盘,保证一个磁盘坏掉,其它仍然可进行读写操作
具体操作:
1、配置hdfs-site.xml文件
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///${hadoop.tmp.dir}/name1,file:///${hadoop.tmp.dir}/name2</value>
</property>
2、停止集群,删除data和logs中所有数据(多台机器均要执行以下操作,保证数据一致性)
stop-dfs.sh
rm -rf /opt/module/hadoop-3.1.3/data
rm -rf /opt/module/hadoop-3.1.3/logs
3、格式化集群启动
bin/hdfs namenode -format
bin/hdfs --daemon start namenode(单个起) start-dfs.sh(群起集群)
4、查看结果
ll /opt/module/hadoop-3.1.3/data
以上是“HDFS中NN和2NN工作机制的示例分析”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
原文链接:https://my.oschina.net/luffycl/blog/4990295