HDFS学习三:NameNode和SecondaryNameNode工作机制

一、NameNode和SecondaryNameNode

1.1 NN与2NN的工作机制

内存中存储元数据,可靠性怎么保证?

为防止元数据丢失,会将元数据备份一份:磁盘中的备份元数据存储在FsImage。

若是更新内存元数据同时更新Fsimage的话,效率太低,不更新的话,数据一致性怎么保证?

内存中元数据更新机制:引入了Edit文件(只进行追加操作,效率很高)。每当元数据有更新或添加元数据时,修改内存中的元数据并追加到Edit中。这样,一旦NameNode节点断电,可以通过合并FsImage和Edits,合成元数据。

长时间添加数据到Edits,会导致该文件数据过大,效率降低,而且一旦断电,恢复元数据的时间很长。因此,需要定期进行FsImage和Edits的合并,如果这个操作只通过NameNode节点完成的话,效率太低。

因此,引入一个新的节点SecondaryNamenode,专门用于FsImage和合并。

HDFS学习三:NameNode和SecondaryNameNode工作机制_第1张图片

1.2 FsImage和Edits解析

namenode节点下FsImage与Edits路径

路径:/hadoop-3.3.1/data/tmp/dfs/name/current

HDFS学习三:NameNode和SecondaryNameNode工作机制_第2张图片

SecondaryNamenode节点下FsImage与Edits路径

/hadoop-3.3.1/data/tmp/dfs/namesecondary/current

HDFS学习三:NameNode和SecondaryNameNode工作机制_第3张图片

区别很明显啊,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. Fsimage文件:HDFS文件系统元数据的一个永久检查点,其中包含HDFS文件系统的所有目录和文件idnode的序列化信息。
  2. Edits文件:存放HDFS文件系统的所有更新操作的路径,文件系统客户端执行的所有写操作首先会被记录到Edits文件中。
  3. seen_txid文件保存的是一个数字,就是最后一个edits_后面接的数。
  4. 每次NameNode启动的时候都会将Fsimage文件读入内存,加载Edits里面的更新操作,保证内存中的元数据信息是最新的、同步的(相当于每次NameNode启动,就将Fsimage和Edits进行了合并)

1.3 CheckPoint时间设置

(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

1.4NameNode故障处理

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.5集群安全模式

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 /

1.6 NameNode多目录配置

NameNode的本地目录可以配置成多个,且每个目录存放相同内容,增加了可靠性。

具体配置如下:

在hdfs-site.xml文件中增加如下内容


dfs.namenode.name.dir
file:///${hadoop.tmp.dir}/dfs/name1,file:///${hadoop.tmp.dir}/dir/name2

停止集群,删除data和logs中所有数据

格式化集群再启动

你可能感兴趣的:(#,Hadoop,hdfs,hadoop,big,data)