源码分析oldwals日志的删除流程

一、介绍

清楚oldwals的日志,这是master的一个后台任务执行。
对于oldwals日志的删除,看网上都说的是两个条件:
1、Hlog文件在参与主从复制,否的话删除,是的话不删除
2、Hlog文件是否在目录中存在 hbase.master.logcleaner.ttl 时间,如果是则删除
通过源码分析,发现这是不对的,具体的删除是根据hbase.master.logcleaner.plugins这个参数对应的
值来决定的。
当前分析的源码版本是:hbase 1.2.0
这里借鉴一下网上其他博客的hmaster初始化的流程图:
源码分析oldwals日志的删除流程

二、hmaster初始化

HMaster启动初始化 ,HMaster构造方法调用 startActiveMasterManager 方法
startActiveMasterManager 方法 调用 finishActiveMasterInitialization(status); 方法
在 finishActiveMasterInitialization 方法中会启动所有服务线程,代码段如下
1、在HMaster类里面,启动startActiveMasterManager方法
源码分析oldwals日志的删除流程

2、进入到startActiveMasterManager方法内部,调用finishActiveMasterInitialization方法
源码分析oldwals日志的删除流程

3、进入到finishActiveMasterInitialization方法内部,调用startServiceThreads方法,初始化线程
源码分析oldwals日志的删除流程

4、进入到startServiceThreads内部,初始化了LogCleaner对象,同时注册到了scheduleChore,这是一个定时调度器
源码分析oldwals日志的删除流程

5、进入到LogCleaner类,可以看到该类继承至CleanerChore
源码分析oldwals日志的删除流程
同时可以看到,该类的初始化方法,调用了父类的构造方法,同时传递了参数hbase.master.logcleaner.plugins进去。
源码分析oldwals日志的删除流程
6、进入到CleanerChore类
在该类的initCleanerChain方法内部,可以看到使用了confkey,也就是hbase.master.logcleaner.plugins参数的值,这个方法的作用
就是初始化cleanersChain,这个列表就可以看成是日志清理的规则。
源码分析oldwals日志的删除流程
除了上面这个方法,chore方法就是定时调度的方法了。
方法调用关系:
chore方法调用--> checkAndDeleteEntries --> checkAndDeleteFiles
在checkAndDeleteFiles方法内部,循环迭代刚刚初始化的cleanersChain
源码分析oldwals日志的删除流程
这个方法的主要作用就是判断哪些文件会被删除。从这个循环迭代来看,cleaner的值跟每一次迭代出来的值有关,而cleaner对象调用了
getDeletableFiles方法,这个方法是在FileCleanerDelegate接口实现的。
源码分析oldwals日志的删除流程

具体的不看那些类实现了该接口,但是,从上述的整个调用关系来看,具体的删除规则跟hbase.master.logcleaner.plugins是有关的,
而在hbase1.2.0版本上,默认的值为:
源码分析oldwals日志的删除流程
也就是说,对于oldwals的删除,只跟ttl相关,也就是默认的10分钟。
这对于开启了hbase的replacation1机制的集群。可能会造成wal还未完全同步,就被删除,从而导致数据丢失的情况。

在hbase2.x版本上:该参数的默认值:

org.apache.hadoop.hbase.master.cleaner.TimeToLiveLogCleaner,org.apache.hadoop.hbase.master.cleaner.TimeToLiveProcedureWALCleaner,org.apache.hadoop.hbase.master.cleaner.TimeToLiveMasterLocalStoreWALCleaner

从中也可以看到,并没有跟replacation相关的WALCleaner日志清理器。

不过,目前来说,hbase官方已经实现了对应的清理器,如下:
源码分析oldwals日志的删除流程
所以理论来说,可以修改hbase.master.logcleaner.plugins参数的值:

org.apache.hadoop.hbase.master.cleaner.TimeToLiveLogCleaner,org.apache.hadoop.hbase.replication.master.ReplicationLogCleaner

目前还未测试。

借鉴:

https://blog.csdn.net/zhangshenghang/article/details/104041381

源码分析oldwals日志的删除流程

上一篇:photoshop通过后期美化及细节修饰将水晶彩妆人像制作出粉色效果


下一篇:面试十题(3)