`
asyty
  • 浏览: 345596 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

HBase 预写日志 (WAL)

阅读更多

 

HBase数据格式包括Log结构参考上一篇日志。

WAL最重要的作用是灾难恢复,一旦服务器崩溃,通过重放log,我们可以恢复崩溃之前的数据。如果写入WAL失败,整个操作也将认为失败。

6  WAL

 

基本流程:首先,客户端初始化一个可能对数据改动的操作,如put(Put),delete(Delete)  incrementColumnValue()。这些操作将被封装在一个KeyValue对象实例中,发送给HRegionServer 一旦达到一定大小,HRegionServer 将其发送给HRegion。这个过程中,数据会首先会被写入WAL,之后将被写到实际存放数据的MemStore中。

 

HLog是实现WAL的类。一个HRegionServer对应一个HLog实例。当HRegion初始化时,HLog将作为一个参数传给HRegion的构造函数。

WAL中几个重要的类:

1.      HLog

HLog最核心的是调用doWriteappend() 方法,任何对数据改动的操作都就将首先调用这个方法。

出于性能考虑,put(), delete() incrementColumnValue()可通过开关函数setWriteToWAL (boolean) 禁用WAL。运行MapReduce Job时,可通过关闭WAL获得性能提升。

HLog另一个重要特性是将通过sequence number追踪数据改变。它内部使用AtomicLong保证线程安全。

2.      HLogKey

上一部分的存储格式中有提到,HLogKey包含的一些主要变量,主要用于记录Key/Value对的归属信息。

3.      LogFlusher

数据以KeyValue形式到达HRegionServer,将写入WAL,之后写入一个SequenceFile。由于数据流在写入文件时经常会缓存以提高性能,因此,有时数据实际保存在内存中。

LogFlusher调用HLog.optionalSync(),后者根据hbase. regionserver. optionallogflushinterval (默认10)定期调用Hlog.sync()HLog.doWrite()也根据hbase.regionserver.flushlogentries  (默认100)定期调用Hlog.sync()Sync() 本身调用HLog.Writer.sync(),它由SequenceFileLogWriter实现。

4.      LogRoller

Log的大小通过$HBASE_HOME/conf/hbase-site.xml hbase.regionserver.logroll.period限制,默认是一个小时。所以每60分钟,会打开一个新的log文件。久而久之,会有一大堆的文件需要维护。LogRoller主要完成日志的清理。

首先,LogRoller调用HLog.rollWriter(),定时滚动日志,之后,利用HLog.cleanOldLogs()可以清除旧的日志。它首先取得存储文件中的最大的sequence number,之后检查是否存在一个log所有的条目的”sequence number”均低于这个值,如果存在,将删除这个log

5.      Replay

旧日志往往由RegionServer 崩溃产生。当HMaster启动或者检测到RegionServer 崩溃,它将日志文件拆分为多份文件,存储在region所属的文件夹。之后,将日志重放。

重放过程:HRegionServer启动,打开所管辖的Region,检查是否存在剩余的log文件,如果存在,调用Store.doReconstructionLog()。重放一个日志只是简单地读入一个日志,将日志中的条目加入到Memstore中。最后,flush操作将Memstore中数据flush到硬盘中。


 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics