工作机制
启动NN内存读取并启动NN内存读取并执行磁盘中上一次没有存满的edit-inprocgress编辑日志生成对应元数据,和fsimage镜像元数据文件(看下面集群启动加载操作),一旦在内存中成功建立文件系统元数据的映像,则创建一个新的Fsimage文件和一个空的编辑日志(edits_inprogress002)。并开始监听datanode的请求,进入短暂的安全模式。
client操作指令过来之后edit-inprogress日志继续记录新日志,直到达到chickpoint条件为止
当edi-inprogerss满容或一小时之后,立即生成一个新的edit-inprogress,而满足chickpoint条件的edit被拷贝到2nn上
当2nn内存满足chickpoint条件之后,合并旧的fsimage文件形成新的fsimage.chickpoint文件,并拷贝到nn上,
拷贝到nn上的镜像文件被重命名为fsimage文件而保存
数据位置
记录启动集群的加载操作的地方
Fsimage和edit文件所在位置及成员:
位置
$HADOOP_HOME/data/hadoop-3.1.3/data/dfs/name/current
成员
- edits_0000…:文本下面详细介绍
- edits_inprogress_000…:用于记录正在执行的操作
- fsimage_0000…:文本下面详细介绍
- fsimage_0000….md5:checksum,校验和文件,用于校验文件的完整性
- seen_txid:最后一个edist_000…134215的数字:134215
- VERSION集群信息:
Fsimage
HDFS文件系统元数据的一个永久检查点,其中包含HDFS文件系统所有目录和inode的序列化信息
以上文本的查看指令:
说明:将镜像文件转换为xml格式后,拉倒window的浏览器进行查阅
hdfs oiv -p 文件类型 -i镜像文件 -o 转换后文件输出路径
例子:
[atguigu@hadoop102 current]$ hdfs oiv -p XML -i fsimage_0000000000000000025 -o /opt/module/hadoop-3.1.3/fsimage.xml
思想
思考:可以看出,Fsimage中没有记录块所对应DataNode,为什么?
答: namenode 不会存放block块的信息,block块在datanode上存储,
集群启动后通过datanode对namenode应答来获取block信息
思考:为什么这么设计?
答:因为block存储在datanode上,而如果namenode存储了块信息,
name当datanode死机后,块掉线,这时候namenode的块信息就是不准确的了
edits
存放在HDFS文件系统的所有更新操作的路径(指令),文件系统客户端执行的所有写操作首先会被记录到Edits中,当namenode启动时加载fsimage文件到内存,并执行edits中的指令在内存中生成元数据,在内存中创建元数据映像
以上文本的查看指令:
hdfs oiv -p 文件类型 -i镜像文件 -o 转换后文件输出路径
例子:
hdfs oiv -p XML -i fsimage_0000000000000000025 -o /opt/module/hadoop-3.1.3/fsimage.xml
CheckPoint时间设置(hdfs-default.xml)
1)通常情况下,SecondaryNameNode每隔一小时执行一次。
[hdfs-default.xml]
<property>
<name>dfs.namenode.checkpoint.period</name>
<value>3600</value>
</property>
2)一分钟检查一次操作次数,当操作次数达到1百万时,SecondaryNameNode执行一次。
<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 >
NameNode故障处理(扩展,了解)
NameNode故障后,可以采用如下两种方法恢复数据。
1)将SecondaryNameNode中数据拷贝到NameNode存储数据的目录;
(1)kill -9 NameNode进程
(2)删除NameNode存储的数据(/opt/module/hadoop-3.1.3/data/tmp/dfs/name)
[atguigu@hadoop102 hadoop-3.1.3]$ rm -rf /opt/module/hadoop-3.1.3/data/tmp/dfs/name/*
(3)拷贝SecondaryNameNode中数据到原NameNode存储数据目录
[atguigu@hadoop102 dfs]$ scp -r atguigu@hadoop104:/opt/module/hadoop-3.1.3/data/tmp/dfs/namesecondary/* ./name/
(4)重新启动NameNode
[atguigu@hadoop102 hadoop-3.1.3]$ hdfs --daemon start namenode
2)使用-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/tmp/dfs/name</value>
</property>
(2)kill -9 NameNode进程
(3)删除NameNode存储的数据(/opt/module/hadoop-3.1.3/data/tmp/dfs/name)
[atguigu@hadoop102 hadoop-3.1.3]$ rm -rf /opt/module/hadoop-3.1.3/data/tmp/dfs/name/*
(4)如果SecondaryNameNode不和NameNode在一个主机节点上,需要将SecondaryNameNode存储数据的目录拷贝到NameNode存储数据的平级目录,并删除in_use.lock文件
[atguigu@hadoop102 dfs]$ scp -r atguigu@hadoop104:/opt/module/hadoop-3.1.3/data/tmp/dfs/namesecondary ./
[atguigu@hadoop102 namesecondary]$ rm -rf in_use.lock
[atguigu@hadoop102 dfs]$ pwd
/opt/module/hadoop-3.1.3/data/tmp/dfs
[atguigu@hadoop102 dfs]$ ls
data name namesecondary
(5)导入检查点数据(等待一会ctrl+c结束掉)
[atguigu@hadoop102 hadoop-3.1.3]$ bin/hdfs namenode -importCheckpoint
(6)启动NameNode
[atguigu@hadoop102 hadoop-3.1.3]$ hdfs --daemon start namenode
安全模式(block信息的汇报)
概述
- namenode启动
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不会进入安全模式。
(理解:安全模式就是为了block信息的获取而存在。)
手动进入安全模式
基本语法
(1)bin/hdfs dfsadmin -safemode get (功能描述:查看安全模式状态)
(2)bin/hdfs dfsadmin -safemode enter (功能描述:进入安全模式状态)
(3)bin/hdfs dfsadmin -safemode leave (功能描述:离开安全模式状态)
(4)bin/hdfs dfsadmin -safemode wait (功能描述:等待安全模式状态)
示例:模拟等待安全模式
示例说明:为了保证在指令在安全模式期间也能正常操作,需要创建脚本,利用wait等待安全模式过去后,能保证指令立即正常执行
step1查看当前模式:
bin/hdfs dfsadmin -safemode get
结果:Safe mode is OFF
step2进入安全模式
bin/hdfs dfsadmin -safemode enter
step3创建并执行脚本
vim safemode.sh
内容:
#!/bin/bash
hdfs dfsadmin -safemode wait
hdfs dfs -put /opt/module/hadoop-3.1.3/README.txt /
执行脚本:
sh safemode
step4再打开一个窗口:离开安全模式
bin/hdfs dfsadmin -safemode leave