天天看点

HBase 日志分割 (log split)

在上一篇博文中,我们提到Master启动时会启动SplitLogManager, 并进行log分割。那么什么是log split, 为什么要进行log split呢?要回答这个问题,我们先来看一下HLog(也叫WAL)的格式,如下图:

HBase 日志分割 (log split)

HLog是每个Region server只有一份,一个region server上的所有region共用一个Hlog, hlog用来在系统异常down掉,MemStore中大量更新丢失时,对数据进行恢复。从上图中可以看出,对每个region的更新在hlog里不是连续的,而是分散在Hlog里的。Hlog中的每项更新都会记录该更新所属的region, HBase要通过在每个region上应用hlog中的更新来恢复数据,因此需要把hlog中的更新按照region分组,这一把hlog中更新日志分组的过程就称为log split(日志分割)。

对于HBase 0.90及之前的版本, log split都是由master完成的, master启动时,所有的log由master顺序进行分割,如果log文件很多很大,这一过程在master上是很耗时的,但是同时所有的region server都在闲着,等待master完成log split。 HBase 0.92版本开始采用了分布式日志分割技术(HBase-1364)。对于分布式日志分割,master负责将日志分割的任务分配给不同的region server,有region server同时并行完成日志分割,大大提升了日志分割速度。

HMaster启动时会启动SplitLogManager,该类负责把log split任务通过创建znode发布到ZooKeeper上,并监控znode了解log split任务完成状态。在每个region server中有单独的线程监控ZooKeeper中log split相关的znode, 一旦发现自己的任务,就开始进行log split, 最终负责log split实际工作的类是HLogSplitter。

分布式日志分割可以通过配置项hbase.master.distributed.log.splitting来控制,默认为true, 即默认情况下分布式日志分割是打开的。

继续阅读