hadoop edits 文件损坏修复办法

      前段时间公司hadoop集群宕机,发现是namenode 磁盘满了。。清理出部分空间后,重启集群时,重启失败。node

又发现集群Secondary namenode 服务也偏偏坏掉,致使全部的操做log持续写入edits.new 文件,等集群宕机的时候文件大小已经达到了丧心病狂的70G+..重启集群报错 加载edits文件失败。分析加载文件报错缘由是磁盘不足致使最后写入的log只写入一半就宕机了。因为log不完整,hadoop再次启动加载edits文件时读取文件报错。因为edits.new 文件过大,存储了好多操做log,因此必需要对其进行修复。ios

        尝试删除文件的最后几行,结果仍是报错。因而查看源码对edits 文件结构进行分析发现是二进制格式,首行为版本号,而后是hadoop运行过程当中的log记录内容,由操做码 +长度(非必须)+其余项组成。apache

edits文件格式分析图

解决办法

报错位置在源码中的方法为org.apache.hadoop.hdfs.server.namenode.FSEditLog.loadFSEdits(EditLogInputStream edits)方法中读取文件最后位置时由于缺乏部分数据报错, 因此把这部分代码单独拿出来,去掉业务操做部分,只留读取过程,记录异常以前的文件长度len,而后将0到len 这部分的内容复制出来成新的edits文件。启动hadoop集群,成功!函数

NameNode启动加载元数据情景分析

  • NameNode函数里调用FSNamesystemm读取dfs.namenode.name.dir和dfs.namenode.edits.dir构建FSDirectory。oop

  • FSImage类recoverTransitionRead和saveNameSpace分别实现了元数据的检查、加载、内存合并和元数据的持久化存储。spa

  • saveNameSpace将元数据写入到磁盘,具体操做步骤:首先将current目录重命名为lastcheckpoint.tmp;而后在建立新的current目录,并保存文件;最后将lastcheckpoint.tmp重命名为privios.checkpoint.日志

  • checkPoint的过程:Secondary NameNode会通知nameNode产生一个edit log文件edits.new,以后全部的日志操做写入到edits.new文件中。接下来Secondary NameNode会从namenode下载fsimage和edits文件,进行合并产生新的fsimage.ckpt;而后Secondary会将fsimage.ckpt文件上传到namenode。最后namenode会重命名fsimage.ckpt为fsimage,edtis.new为edits;server

    PS:
内存

最新的CDH版本的hadoop 集群启动能够对edits文件进行recover操做,跳过报错loghadoop

相关文章
相关标签/搜索