内存中存储元数据,可靠性怎么保证?
为防止元数据丢失,会将元数据备份一份:磁盘中的备份元数据存储在FsImage。
若是更新内存元数据同时更新Fsimage的话,效率太低,不更新的话,数据一致性怎么保证?
内存中元数据更新机制:引入了Edit文件(只进行追加操作,效率很高)。每当元数据有更新或添加元数据时,修改内存中的元数据并追加到Edit中。这样,一旦NameNode节点断电,可以通过合并FsImage和Edits,合成元数据。
长时间添加数据到Edits,会导致该文件数据过大,效率降低,而且一旦断电,恢复元数据的时间很长。因此,需要定期进行FsImage和Edits的合并,如果这个操作只通过NameNode节点完成的话,效率太低。
因此,引入一个新的节点SecondaryNamenode,专门用于FsImage和合并。
namenode节点下FsImage与Edits路径
路径:/hadoop-3.3.1/data/tmp/dfs/name/current
SecondaryNamenode节点下FsImage与Edits路径
/hadoop-3.3.1/data/tmp/dfs/namesecondary/current
区别很明显啊,NameNode多了seen_txid和edits_inprogress文件
查看镜像文件的命令:把文件转换成xml格式
hdfs oiv -p XML -i fsimage_0000000000000000055 -o fsimage.xml
查看Edits文件命令:
hdfs oev -p XML -i edits_0000000000000000001-0000000000000000002 -o edits.xml
(1)通常情况下,SecondaryNameNode每隔1小时执行一次。
可以设置在hdfs-default.xml
dfs.namenode.checkpoint.period
3600
(2)一分钟检查一次操作数,当操作数达到100万次,SecondaryNameNode执行一次。
dfs.namenode.checkpoint.txns
1000000
dfs.namenode.checkpoint.check.period
60
NameNode出问题后,可以采用以下两种方法恢复数据:
方法一:将SecondaryNameNode中的数据拷贝到NameNode存储数据的目录;
1.kill -9 NameNode进程
2.删除 NameNode 存储的数据(/hadoop-3.3.1/data/tmp/dfs/name/下所有文件)
3.拷贝SecondaryNameNode中数据到原NameNode存储数据目录(/hadoop-3.3.1/data/tmp/dfs/namesecondary/下所有数据拷贝过去)
方法二:使用-importCheckpoint选项启动NameNode守护进程,从而将SecondaryNameNode中数据拷贝到NameNode目录中
1.修改hdfs-site.xml中的
dfs.namenode.checkpoint.period
120
dfs.namenode.name.dir
/hadoop-3.3.1/data/tmp/dfs/name
2.kill -9 NameNode进程
3.删除NameNode存储的数据(/data/tmp/dfs/name/下所有数据)
4.如果SecondaryNameNode不和NameNode在一个节点上,将SecondaryNameNode存储数据的目录(/data/tmp/dfs/namesecondary整个文件夹包括namesecondary)拷贝到NameNode存储数据的同级目录(/data/tmp/dfs/)下。并删除in-use.lock文件
5.输入以下命令导入检查点数据(稍微等一会再ctrl c结束)
hdfs namenode -importCheckpoint
6.启动NameNode
1.namenode启动
首先将镜像文件Fsimage载入内存,并执行编辑日志Edits中的各项操作。一旦在内存中成功建立文件系统元数据的映像,则创建一个新的Fsimage文件和一个空的编辑日志。此时,NameNode开始监听DataNode请求。这个过程期间,NameNode一直运行在安全模式,即NameNode的文件系统对于客户端来说是只读的。
2.DataNode启动
系统中的数据块的位置并不是由NameNode维护的,而是以块列表的形式存储在DataNode中,在系统的正常操作期间,NameNode会在内存中保留所有块位置的映射信息。在安全模式下,各个DataNode会向NameNode发送最新的块列表信息,NameNode了解到足够多的块位置信息之后,即可高效的运行文件系统。
3.安全模式退出判断
如果满足“最小副本条件”,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 (等待安全模式)
hdfs dfsadmin -safemode get
bin/hdfs dfsadmin-safemode enter (进入安全模式)
创建并执行以下脚本
touch safemode.sh
vim safemode.sh
wait就是等待安全模式离开后,立马执行上传文件命令,先执行脚本,上传命令暂时不执行,离开安全模式后,脚本继续执行完成上传任务。
#!/bin/bash
hdfs dfsadmin -safemode wait
hdfs dfs -put /opt/software/hadoop-3.3.1/README.txt /
NameNode的本地目录可以配置成多个,且每个目录存放相同内容,增加了可靠性。
具体配置如下:
在hdfs-site.xml文件中增加如下内容
dfs.namenode.name.dir
file:///${hadoop.tmp.dir}/dfs/name1,file:///${hadoop.tmp.dir}/dir/name2
停止集群,删除data和logs中所有数据
格式化集群再启动