NameNode持久化场景引入:

问题:NameNode宕机,导致内存中的文件元数据丢失怎么办?我们知道元数据是存储来内存中的,所以一旦宕机,内存数据是会丢失的,因此为了避免数据丢失,HDFS中出现了该持久化技术。
解决:NameNode会将内存中的元数据持久化到磁盘中。

持久化两大方案:日志持久化、快照持久化



日志持久化概念:将client客户端对HDFS执行的增删改操作命令记录在日志文件中,方便以后宕机数据丢失,再次运行这些操作命令,每当有一个操作命令需要执行,首先记录在editslog 也就是我们的日志持久化文件中,再完成实际操作,保证每一个操作都对应的有日志去完成备份。



日志持久化优缺点:

优点 时效性极高,数据恢复安全,能够完完全全恢复丢失的NN(NameNode)元数据。

缺点 恢复时间长,举个例子,我们对元数据的操作做了N多次很多修改,最后用户将该存储文件删除,我们的元数据中不应该再有该数据,我们之前的editslog日志就白白运行许多命令。



快照持久化概念:每隔一段时间,将内存中的元数据信息,持久化存储起在fsimage快照中。



快照持久化优缺点:

优点 恢复快,比一条条的数据恢复快很多。

缺点 数据持久化不安全,不能保证最后宕机前的部分数据保存在恢复快照中,时效性差。

checkpoint:

![](https://img2020.cnblogs.com/blog/1629390/202103/1629390-20210314104956045-841472848.png)
因此我们得知我们最好使用两者的优点来进行存储的恢复,数据安全不得马虎,时效性同时更要保证,我们HDFS出现了SNN-SecondaryNamenode:

secondaryNameNode是NameNode的助理,将日志editslog合并到快照fsimage中。如下图所示,首先大概了解下两者合并的机制,我们的日志持久化依然按照来一条操作,记录一条日志的工作机制,当数据达到一定的量,默认100w条时候,完成一个合并操作:系统首先保存一个0号原始快照(fsimage0),然后editslog0记录实时的指令日志,当达到合并时机时,fsimage0和editslog发送到SNN中完成合并,由该助理帮助我们合并成新的快照fsimage1,将fsimage1复制发送给NameNode,以备宕机时候做为最新的快照来回复时间,尽全力保证了快照的时效性。

值得注意的是!我们执行fsimage0和editslog0合并成fismage1的操作的同时,新来的指令会记录在editslog1中,完完全全保证了时效性,这个正在记录实时操作的日志文件,没有达到合并时机(checkpoint)之前,是始终在NN(Namenode)中的,我们一旦宕机,fsimage1和editslog1足以完完全全保证所有信息的恢复。完成了安全的持久化。
![](https://img2020.cnblogs.com/blog/1629390/202103/1629390-20210314105124904-98536356.png)

持久化结论:

1. HDFS接受客户端的文件操作后。

2. 先将操作的命令 以日志的方式记录到editslog中。

3. 然后再将指令对应的文件元数据的修改操作,修改内存中的元数据信息。

4. SNN定期负责将editslog中的文件合并到fsimage中,数据恢复时用最新的正在记录的editslog合并最新的fsimage快照即可。

SNNcheckpoint机制:

1. SecondaryNameNode向NameNode发起合并请求

2. NameNode将当前的Editslog文件保存改名edits,并新建EditsLog继续持久化工作。

3. 将改名后的edits文件和本地的FSImage(旧)发送给sencondaryNameNode

4. SecondaryNameNode负责将FSImage(旧)+edits文件合并成FSImage(新)

5. 将新的FSImage(新)发送给NameNode保存。

checkpoint触发条件(时机):

每1分钟检查一次触发条件。(SNN没隔1分钟,访问一次NN)

1. 每隔1小时触发一次checkPoint

2. 每100w次操作,触发一次checkpoint
![](https://img2020.cnblogs.com/blog/1629390/202103/1629390-20210314110122189-2045615060.png)

后续我们需要注意的一些配置操作:

SNN和NN在一个服务器是上,存在单点故障。

场景:一旦服务器磁盘崩坏,持久化的数据就会全部丢失。

解决:SNN 和NN放在不同的服务器上。

那么怎么配置SNN的服务器位置呢?可以对hdfs-site.xml中的SNN的节点地址进行配置,需要注意的是我们需要配置文件通过Linux命令发送到所有的服务器中,做到统一。可以用scp命令。

![](https://img2020.cnblogs.com/blog/1629390/202103/1629390-20210314110628216-1879150187.png)

单独启动SecondaryNameNode:

hadoop-deamon start secondarynamenode

当面试问到: snn的职责
namenode如何做数据持久化
checkpoint的流程
edis和fsimage分别做什么,这些基本没有差别,我们通过讲述两大持久化方案,合并优点,checkpoint合并机制流程即可。

个人随笔,转载注明引用,已经上传关于HDFS分布式的配置详情文档

关于HDFS存储元数据的NameNode持久化存储的更多相关文章

  1. 11.scrapy框架持久化存储

    今日概要 基于终端指令的持久化存储 基于管道的持久化存储 今日详情 1.基于终端指令的持久化存储 保证爬虫文件的parse方法中有可迭代类型对象(通常为列表or字典)的返回,该返回值可以通过终端指令的 ...

  2. scrapy之持久化存储

    scrapy之持久化存储 scrapy持久化存储一般有三种,分别是基于终端指令保存到磁盘本地,存储到MySQL,以及存储到Redis. 基于终端指令的持久化存储 scrapy crawl xxoo - ...

  3. scrapy框架持久化存储

    基于终端指令的持久化存储 基于管道的持久化存储 1.基于终端指令的持久化存储 保证爬虫文件的parse方法中有可迭代类型对象(通常为列表or字典)的返回,该返回值可以通过终端指令的形式写入指定格式的文 ...

  4. Scrapy持久化存储

    基于终端指令的持久化存储 保证爬虫文件的parse方法中有可迭代类型对象(通常为列表or字典)的返回,该返回值可以通过终端指令的形式写入指定格式的文件中进行持久化操作; 执行输出指定格式进行存储:将爬 ...

  5. Redis持久化存储详解(一)

    > 为什么要做持久化存储? 持久化存储是将 Redis 存储在内存中的数据存储在硬盘中,实现数据的永久保存.我们都知道 Redis 是一个基于内存的 nosql 数据库,内存存储很容易造成数据的 ...

  6. scrapy框架的持久化存储

    一 . 基于终端指令的持久化存储 保证爬虫文件的parse方法中有可迭代类型对象(通常为列表or字典)的返回,该返回值可以通过终端指令的形式写入指定格式的文件中进行持久化操作. 执行输出指定格式进行存 ...

  7. Scarpy框架持久化存储

    一.介绍 持久化存储操作分为两类:磁盘文件和数据库. 而磁盘文件存储方式又分为:基于终端指令和基于管道 二.基于终端指令的持久化存储 Scrapy是通过 scrapy 命令行工具进行控制的. 这里我们 ...

  8. 11,scrapy框架持久化存储

    今日总结 基于终端指令的持久化存储 基于管道的持久化存储 今日详情 1.基于终端指令的持久化存储 保证爬虫文件的parse方法中有可迭代类型对象(通常为列表or字典)的返回,该返回值可以通过终端指令的 ...

  9. scrapy 框架持久化存储

    1.基于终端的持久化存储 保证爬虫文件的parse方法中有可迭代类型对象(通常为列表或字典)的返回,该返回值可以通过终端指令的形式写入指定格式的文件中进行持久化操作. # 执行输出指定格式进行存储:将 ...

随机推荐

  1. bitbar 网站攻击实验

    实验环境 https://github.com/TouwaErioH/security/tree/master/web1 Windows10 Oracle VM VirtualBox Ubuntu16 ...

  2. 容器之List接口下各实现类(Vector,ArrayList 和LinkedList)的线程安全问题

    Vector .ArrayList 和LinkedList都是List接口下的实现类,但是他们之间的区别和联系是什么呢? 首先: 然后: 如果您仅仅想知道结论,那么可以关闭了. 下面我讨论讨论为什么. ...

  3. vue中获取元素并控制相应的dom

    1 在标签中使用ref="xxx" 2 在methods中调用this.$refs.xxx this.$refs.xxx.$el获取dom 注意1:大多数情况下为了复用方法,将xx ...

  4. 手工数据结构系列-C语言模拟队列和栈 hdu1702

    #include <stdio.h> #include <stdlib.h> //================= DATA STRUCTURE ============== ...

  5. 使用opencv-python实现MATLAB的fspecial('Gaussian', [r, c], sigma)

    reference_opencv实现高斯核 reference_MATLAB_fspecial函数说明 # MATLAB H = fspecial('Gaussian', [r, c], sigma) ...

  6. html template tag

    html template tag const tagName = `emoji-element`; const template = document.createElement('template ...

  7. github & webhooks

    github & webhooks git auto commit bash shell script https://developer.github.com/webhooks/ POST ...

  8. Electron in Action

    Electron in Action $ yarn add -D electron@latest # OR $ npm i -D electron@latest https://www.electro ...

  9. taro 如何展示多行文本 省略号

    taro 如何展示多行文本 省略号 webkit-box-orient: vertical; See the Pen Pure CSS multiline text with ellipsis by ...

  10. 「NGK每日快讯」2021.1.15日NGK公链第73期官方快讯!