splitlog是保证在重启或rs挂掉后,恢复hlog的重要手段。master需要将hlog写到各个region目录下的recovered.edits目录中,然后由各台rs自行replay这个目录来恢复数据。这个过程中,master会启动一个读线程和多个写线程,一边读到内存中,一边将内存队列中的数据写到各个目录中去。
当master将.logs下的数据写到recovered.edits后,会把.logs目录下的文件mv到.oldlogs中。如果splitlog期间master挂掉,下次启动时会重复以上过程。但是杯具的是,master并不会等待recovered.edits写完以后再将.logs下的文件mv到.oldlogs中,而是当.logs下的文件读入内存结束以后就执行mv操作。因此如果这些数据在内存还没有写完成recovered.edits时,mv操作又结束时master就挂掉,则数据就丢失了。当然实际情况出现的概率还是比较小的,因为master并不是一次把.logs全部读入内存,而是128MB地读,所以只有当最后一个128MB在内存中时,才会执行mv操作,这时就有丢失数据的风险了。应对以下代码做调整:
Index: src/main/java/org/apache/hadoop/hbase/regionserver/wal/HLogSplitter.java
===================================================================
--- src/main/java/org/apache/hadoop/hbase/regionserver/wal/HLogSplitter.java (revision 99281)
+++ src/main/java/org/apache/hadoop/hbase/regionserver/wal/HLogSplitter.java (working copy)
@@ -289,10 +289,10 @@
"Discovered orphan hlog after split. Maybe the "
+ "HRegionServer was not dead when we started");
}
- archiveLogs(srcDir, corruptedLogs, processedLogs, oldLogDir, fs, conf);
} finally {
LOG.info("Finishing writing output logs and closing down.");
splits = outputSink.finishWritingAndClose();
+ archiveLogs(srcDir, corruptedLogs, processedLogs, oldLogDir, fs, conf);
}
return splits;
}
即将mv操作移动到等所有写线程结束以后再做。这样数据就不会丢失了。带来的副作用是在异常退出而下次启动时有可能在recovered.edits下面重复写log文件(因为上次退出时有可能留下一些文件)。但这最多增加一点重启的时间,总要比丢失数据好。
分享到:
相关推荐
`readme.txt`文件通常包含有关如何使用或配置`splitlog.cmd`的说明,例如执行脚本的步骤、所需权限、可能遇到的问题及解决方法等。它为用户提供了执行此日志分割方案的指南。 总的来说,这种自动分割日志的方法旨在...
面向对象程序设计是Java SE(标准版)的核心特性之一,任务101主要涉及文件和流的操作,以及图像处理。在此任务中,我们将探讨如何利用Java...完成这个任务,不仅可以深化Java编程技能,还能提升处理实际问题的能力。
/hbase/archive (1) 进行snapshot或者升级的时候使用到的归档目录。compaction删除hfile的时 候,也会把旧的hfile归档到这里等。 /hbase/corrupt (2) splitlog的corrupt目录,以及corrupt hfile的目录。
LogSplitter是Apache的日志处理程序,结合了rotatelog,splitlog和(部分)cronolog的功能。
Struts2+Hibernate+mysql+eclipse在线考试系统_hy4.zip
【Java】基于rbac思想以及ssm框架(导入jar包的方式)的权限管理项目
AndrewNg机器学习对应PythonJupyterNotebook_hy4
玄武是针对影视特效和动画行业的项目流程管理系统,基于图形图像行业流行的Python开发语言,整合现有CG工作流程,通过_hy4
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
基于Nestjs的RBAC权限系统开发实战_hy4
【Python】基于rbac权限分配、动态二级菜单、面包屑、批量操作_pgj
SpringBlade3.0架构核心工具包,SpringBlade是一个由商业级项目升级优化而来的SpringCloud分布_hy4
该项目是一款基于Vue框架的uniapp分销商城小程序设计源码,包含1412个文件,涵盖471个JavaScript文件、292个Vue文件、253个Markdown文件、202个JSON文件、43个映射文件、34个SCSS文件、33个微信小程序样式文件、33个WXML文件、22个PNG图片文件、9个WXS文件。该项目适用于构建分销商城小程序,支持微信小程序平台,并集成了多种编程语言和文件类型,以实现高效和灵活的开发需求。
java教务管理系统教学管理系统,系统页面设计良好、内容丰富、功能齐全,适合用做课设学习。含有源码、数据库文件以及项目资料文档,感_hy4
【Python】四川大学微服务健康每日报自动打卡
设计模式学习笔记_hy5
该项目是一个以C++为主要编程语言的算法设计与实现学习资源,包含190个文件,涵盖131个头文件(.h)、41个C++源文件(.cpp)、12个其他文件(.a)、2个文本文件(.txt)、1个Git忽略文件(.gitignore)、1个Markdown文件(.md)、1个C编译配置文件(.cc)、1个Protocol Buffers描述文件(.proto)。这些文件共同构成了一个全面的学习材料,旨在帮助开发者深入理解算法设计原理及其在C++语言中的实现。
使用C++实现的23种设计模式_hy4
医疗器械检测系统源码分享