在现有的HDFS中,为了保证元数据的高可用性,我们可以在配置项dfs.namenode.name.dir中配置多个元数据存储目录来达到多备份的作用。这样一来,如果其中一个目录文件损坏了,我们可以选择另外可用的文件。那么问题来了,如果所有备用的元数据都损坏了,不能用了,这个时候怎么办,那么是否就意味着集群就永远启动不起来了呢?这将会是一个多么糟糕的结果啊。在这里,我们就要引出本文的主题:HDFS的数据恢复模式(Recovery Mode)。

其实就是元数据的自我恢复的启动模式,所以他并不是DataNode上真实数据的恢复。

另外,数据恢复针对的是editlog,而不是fsimage。

HDFS数据恢复模式的原理:

NameNode在启动的时候,会通过FSNamesystem加载fsimage文件和editlog. 如果Editlog文件有损坏,会导致NameNode启动异常,从而导致NameNode不能正常启动.

在Recovery Mode下,NameNode则会智能的跳过这些错误的情况,从而保证NameNode成功启动,启动之后,会生成一个新的FSImage,然后再次退出,下一次就可以正常的启动的集群了,因为现在用的是新的fsimage

第一步:使用hdfs命令: hdfs namenode -recover

第二步:NameNode启动,会根据参数recover,进入recover流程,NameNode.doRecovery(startOpt,conf);

private static void doRecovery(StartupOption  startOpt, Configuration conf) throws IOException {

String nsId = DFSUtil.getNamenodeNameServiceId(conf);

String namenodeId = HAUtil.getNameNodeId(conf, nsId);

initializeGenericKeys(conf, nsId, namenodeId);

//省略

FSNamesystem fsn = null;

try {

//开始正式进入数据恢复流程

fsn = FSNamesystem.loadFromDisk(conf);

fsn.getFSImage().saveNamespace(fsn);

MetaRecoveryContext.LOG.info("RECOVERYCOMPLETE");

} catch (IOException e) {

MetaRecoveryContext.LOG.info("RECOVERYFAILED: caught exception", e);

throw e;

} catch (RuntimeException e) {

MetaRecoveryContext.LOG.info("RECOVERYFAILED: caught exception", e);

throw e;

} finally {

if (fsn != null)

fsn.close();

}

}

第三步: FSNamesystem调用loadFromDisk会判断参数是不是RECOVER,如果是RECOVER则会设置安全模式

第四步: 构造数据恢复上下文对象

MetaRecoveryContextrecovery = startOpt.createRecoveryContext();

final boolean staleImage = fsImage.recoverTransitionRead(startOpt, this, recovery);

第五步: recoverTransitionRead会调用loadFSImage方法,最后会调用到LoadEditRecords方法,如果文件损坏,如果不是recover模式,抛出异常;否则跳过错误记录,重新定位到下一个有效的操作记录

第六步:读完有效的editlog记录,就把它apply到内存

第七步:然后NameNode会执行一次saveNameSpace方法,就会生成一个新的FSImage文件

HDFS数据恢复模式相关推荐

  1. HDFS HA模式下支持只连接其中Active的NameNode

    HDFS HA模式下支持只连接其中Active的NameNode:

  2. HDFS精华文章汇总

    前言 自2015年下半年起,笔者开始写关于Hadoop的文章(主要集中在HDFS),包括源码分析类的,问题分析解决又或者是内部机制剖析.这些文章目前汇总数量已经达到70+篇.这些文章对于笔者来说是一个 ...

  3. 使用Cloudera Manager搭建zookeeper集群及HDFS HA实战篇

    使用Cloudera Manager搭建zookeeper集群及HDFS HA实战篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.使用Cloudera Manager搭建zo ...

  4. iphone数据迁移到新iphone_Mac专业iPhone数据恢复软件----Omni Recover

    Omni Recover mac是一个MacOS上的专业iPhone数据恢复软件,Omni Recover Mac版可以检索多达20多种类型的iOS数据,支持从iDevices恢复丢失的数据,轻松帮你 ...

  5. flume 一对多hdfs_10PB 规模的 HDFS 数据在 eBay 的迁移实战

    导读 INTRODUCTION Hadoop分布式文件系统(HDFS)是指被设计成适合运行在通用硬件上的分布式文件系统(Distributed File System).本文将介绍eBay ADI H ...

  6. ONLY三行脚本, SQL数据恢复到指定时间点

    经常看到有人误删数据,或者误操作,特别是Update和Delete的时候没有加WHERE ... 然后就喊爹喊娘了,怕是亲爹妈也无奈摇肩. 话说,如果没有犯过错误,那你还算是搞程序的吗?!没了偶尔的心 ...

  7. 大数据-HDFS 配置与使用

    导语   在之前的分享中我们知道HDFS有三种模式:单机模式.伪集群模式和集群模式. 文章目录 HDFS 配置和启动 启动 HDFS HDFS 使用 HDFS Shell HDFS API 单机模式: ...

  8. sd卡测速工具_SD卡数据恢复教程与恢复方法

    SD卡是很常用的数据存储设备之一,经常用来存储相片.视频.音频等重要数据.然而SD卡上的数据会因误删除.格式化.RAW分区等原因丢失,遇到SD卡数据丢失的问题该怎么办呢?别着急,其实恢复方法很简单,今 ...

  9. 免费回收站恢复软件有哪些?数据恢复软件,这三款就足够了

    一般我们删除的东西会进入回收站里.如果电脑回收站没有被清空,那么打开它,就很容易找到自己的删除的文件.右键文件选择"恢复",删除的文件就能恢复到它原来的位置,再打开对应的文件夹就能 ...

最新文章

  1. jq 控制td只显示一行_9月22日现货黄金、白银TD、黄金TD、纸黄金、纸白银价格走势分析...
  2. bean加载时调用@value时会出现空指针异常_SpringMVC全局异常处理机制
  3. RTSP、RTMP和HTTP协议的区别
  4. linux下简单的备份的脚本 2 【转】
  5. 如何在 C# 9 中使用record类型?
  6. linux c之assert函数使用总结
  7. 云计算的基础设施服务
  8. 250分b区计算机专硕,2021兰州大学研究生复试分数线
  9. office 论文 页码_还在花钱找人排版?这份最全攻略,让你论文一次过!
  10. oracle下载安装教程
  11. Unity3D NGUI图文混排聊天表情
  12. 7分钟学会匿名管道pipe()的使用(内附完整代码测试)
  13. 模拟电子技术之运算放大器
  14. 记录一下blender烘焙光照漫反射贴图
  15. iOS组件化——蘑菇街案例分析
  16. 数据分析学习总结笔记01:情感分析
  17. C. Get an Even String
  18. 彻底解决电脑弹出USB设备时:提示该设备正在使用中无法弹出问题
  19. 7的整除特征 三位一截_小学数学竞赛七、数的整除特征(一)
  20. Raptor实践参考:要么错误要么求和

热门文章

  1. tomcat 在WIN10 上运行出现500错误的解决方法
  2. pytorch得到中间层输出
  3. 2021辽宁高考成绩查询公布,2021辽宁高考成绩什么时候出
  4. oracle delete远程表,用脚本实现表的远程准实时同步
  5. java 等待提示 事件_Java,Jsp点击事件后,出现等沙漏,处理等待状态时,有提示在动,适合任何事件使用...
  6. easyui结合java,Spring+SpringMVC+MyBatis+easyUI整合基础篇(二)牛刀小试
  7. mysql df_DF学Mysql(一)——数据库基本操作
  8. spring学习笔记四(注入Bean属性)
  9. Java编写程序将数据存入Kafka中
  10. 有向图的强连通分量,割点与桥