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. Kubernets二进制安装(14)之flannel之SNAT规则优化

    flannel之SNAT规则优化的目的是由于在K8S中的容器内,访问不同宿主机中的容器的资源的时候,日志文件会记录为宿主机的IP地址,而不是记录为容器本身自己的IP地址,建议在不同的宿主机上的容器互访 ...

  2. Java RMI 实现一个简单的GFS(谷歌文件系统)——介绍篇

    本系列主要是使用Java RMI实现一个简单的GFS(谷歌文件系统,google file system),首先整体简单介绍下该项目. [为了更好的阅读以及查看其他篇章,请查看原文:https://w ...

  3. pyspark Py4JJavaError: Unsupported class file major version 56

    在jupyter notebook跑上面的代码的时候报错Py4JJavaError: An error occurred while calling z:org.apache.spark.mllib. ...

  4. canvas实现简易时钟效果

    代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8& ...

  5. 计蒜客第五场 UCloud 的安全秘钥(中等) (尺取游标法

    每个 UCloud 用户会构造一个由数字序列组成的秘钥,用于对服务器进行各种操作.作为一家安全可信的云计算平台,秘钥的安全性至关重要.因此,UCloud 每年会对用户的秘钥进行安全性评估,具体的评估方 ...

  6. HDU 3247 Resource Archiver(AC自动机 + 状压DP + bfs预处理)题解

    题意:目标串n( <= 10)个,病毒串m( < 1000)个,问包含所有目标串无病毒串的最小长度 思路:貌似是个简单的状压DP + AC自动机,但是发现dp[1 << n][ ...

  7. FTP 与 SSH 的安全性对比, 以及FTP,SSH,SFTP,SCP 的关系简单解析!

    FTP 与 SSH 的安全性对比? ftP: http://baike.baidu.com/subview/369/6149695.htm TCP/IP协议中,FTP标准命令TCP端口号为21,Por ...

  8. OSS & Object Storage Service

    OSS & Object Storage Service Object Storage Service https://en.wikipedia.org/wiki/Object_storage ...

  9. vue & $router & History API

    vue & $router gotoTemplateManage(e) { e.preventDefault(); this.$router.push({ path: `/operate-to ...

  10. gitLab的使用 和 git 、 github、gitlab的区别

    一.git . github.gitlab的区别  (百度相关内容得到的理解) ​ ​ 二.git最基本作用:版本控制 ​ 三.有集成了git的GIT安装包 github和gitlab都使用git该版 ...