工作机制

image.png
启动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文件而保存


数据位置

记录启动集群的加载操作的地方

image.png


Fsimage和edit文件所在位置及成员:

位置

  1. $HADOOP_HOME/data/hadoop-3.1.3/data/dfs/name/current

image.png
成员

  1. edits_0000…:文本下面详细介绍
  2. edits_inprogress_000…:用于记录正在执行的操作
  3. fsimage_0000…:文本下面详细介绍
  4. fsimage_0000….md5:checksum,校验和文件,用于校验文件的完整性
  5. seen_txid:最后一个edist_000…134215的数字:134215

image.png

  1. VERSION集群信息:

image.png


Fsimage

HDFS文件系统元数据的一个永久检查点,其中包含HDFS文件系统所有目录和inode的序列化信息
image.png
image.png
以上文本的查看指令:
说明:将镜像文件转换为xml格式后,拉倒window的浏览器进行查阅

  1. hdfs oiv -p 文件类型 -i镜像文件 -o 转换后文件输出路径
  2. 例子:
  3. [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中的指令在内存中生成元数据,在内存中创建元数据映像

image.png
以上文本的查看指令:

  1. hdfs oiv -p 文件类型 -i镜像文件 -o 转换后文件输出路径
  2. 例子:
  3. 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]

  1. <property>
  2. <name>dfs.namenode.checkpoint.period</name>
  3. <value>3600</value>
  4. </property>

2)一分钟检查一次操作次数,当操作次数达到1百万时,SecondaryNameNode执行一次。

  1. <property>
  2. <name>dfs.namenode.checkpoint.txns</name>
  3. <value>1000000</value>
  4. <description>操作动作次数</description>
  5. </property>
  6. <property>
  7. <name>dfs.namenode.checkpoint.check.period</name>
  8. <value>60</value>
  9. <description> 1分钟检查一次操作次数</description>
  10. </property >

NameNode故障处理(扩展,了解)

NameNode故障后,可以采用如下两种方法恢复数据。
1)将SecondaryNameNode中数据拷贝到NameNode存储数据的目录;
(1)kill -9 NameNode进程
(2)删除NameNode存储的数据(/opt/module/hadoop-3.1.3/data/tmp/dfs/name)

  1. [atguigu@hadoop102 hadoop-3.1.3]$ rm -rf /opt/module/hadoop-3.1.3/data/tmp/dfs/name/*
  1. 3)拷贝SecondaryNameNode中数据到原NameNode存储数据目录
  1. [atguigu@hadoop102 dfs]$ scp -r atguigu@hadoop104:/opt/module/hadoop-3.1.3/data/tmp/dfs/namesecondary/* ./name/
  1. 4)重新启动NameNode
  1. [atguigu@hadoop102 hadoop-3.1.3]$ hdfs --daemon start namenode

2)使用-importCheckpoint选项启动NameNode守护进程,从而将SecondaryNameNode中数据拷贝到NameNode目录中。
(1)修改hdfs-site.xml中的

  1. <property>
  2. <name>dfs.namenode.checkpoint.period</name>
  3. <value>120</value>
  4. </property>
  5. <property>
  6. <name>dfs.namenode.name.dir</name>
  7. <value>/opt/module/hadoop-3.1.3/data/tmp/dfs/name</value>
  8. </property>

(2)kill -9 NameNode进程
(3)删除NameNode存储的数据(/opt/module/hadoop-3.1.3/data/tmp/dfs/name)

  1. [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文件

  1. [atguigu@hadoop102 dfs]$ scp -r atguigu@hadoop104:/opt/module/hadoop-3.1.3/data/tmp/dfs/namesecondary ./
  2. [atguigu@hadoop102 namesecondary]$ rm -rf in_use.lock
  3. [atguigu@hadoop102 dfs]$ pwd
  4. /opt/module/hadoop-3.1.3/data/tmp/dfs
  5. [atguigu@hadoop102 dfs]$ ls
  6. data name namesecondary

(5)导入检查点数据(等待一会ctrl+c结束掉)

  1. [atguigu@hadoop102 hadoop-3.1.3]$ bin/hdfs namenode -importCheckpoint

(6)启动NameNode

  1. [atguigu@hadoop102 hadoop-3.1.3]$ hdfs --daemon start namenode

安全模式(block信息的汇报)

概述

  1. 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. 1bin/hdfs dfsadmin -safemode get (功能描述:查看安全模式状态)
  2. 2bin/hdfs dfsadmin -safemode enter (功能描述:进入安全模式状态)
  3. 3bin/hdfs dfsadmin -safemode leave (功能描述:离开安全模式状态)
  4. 4bin/hdfs dfsadmin -safemode wait (功能描述:等待安全模式状态)

示例:模拟等待安全模式
示例说明:为了保证在指令在安全模式期间也能正常操作,需要创建脚本,利用wait等待安全模式过去后,能保证指令立即正常执行
step1查看当前模式:

  1. bin/hdfs dfsadmin -safemode get
  2. 结果:Safe mode is OFF

step2进入安全模式

  1. bin/hdfs dfsadmin -safemode enter

step3创建并执行脚本

  1. vim safemode.sh

内容:

  1. #!/bin/bash
  2. hdfs dfsadmin -safemode wait
  3. hdfs dfs -put /opt/module/hadoop-3.1.3/README.txt /

执行脚本:

  1. sh safemode

step4再打开一个窗口:离开安全模式

  1. bin/hdfs dfsadmin -safemode leave