博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hadoop edits 文件损坏修复办法
阅读量:2353 次
发布时间:2019-05-10

本文共 1276 字,大约阅读时间需要 4 分钟。

文章来源:http://blog.csdn.net/wisgood/article/details/47066017?ref=myread

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

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

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

edits文件格式分析图

解决办法

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

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

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

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

  • 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;

    PS:

最新的CDH版本的hadoop 集群启动可以对edits文件进行recover操作,跳过报错log

你可能感兴趣的文章
windows Xp NTLDR is missing
查看>>
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
查看>>
Centos 6.x 安装配置MySQL
查看>>
-source 1.5 中不支持 diamond 运算 请使用 -source 7 或更高版本以启用
查看>>
jar包读取资源文件报错:找不到资源文件(No such file or directory)
查看>>
超简单:Linux安装rar/unrar工具与解压到目录示例
查看>>
Eclipse创建Maven Java8 Web项目,并直接部署Tomcat
查看>>
Centos7:Docker安装Gitlab
查看>>
Kafka日志配置
查看>>
logstash 6.x 收集syslog日志
查看>>
信用卡反欺诈
查看>>
线性回归
查看>>
浏览器以只读方式打开PDF
查看>>
CDH和HDP下载地址
查看>>
MysqlDataTruncation: Data truncation: Incorrect string value: '\xF0\x9D\x90\xB6"#...' for column
查看>>
.MysqlDataTruncation: Data truncation: Data too long for column 'content' at row 1
查看>>
com.mysql.jdbc.PacketTooBigException: Packet for query is too large (1146177 > 1048576).
查看>>
Elasticsearch 7.x生产配置
查看>>
AccessDeniedException: /opt/elasticsearch-7.0.0/config/elasticsearch.keystore
查看>>
bootstrap-table 父子表 联动表 完整例子
查看>>