HBase 的MOB压缩分区策略介绍

版权声明:本文为博主原创文章。未经博主同意不得转载。 https://blog.csdn.net/zNZQhb07Nr/article/details/79832392

       HBase应用场景很广泛。社区前面有一系列文章。

大家能够到社区看看看。张少华同学本篇主要讲HBase的MOB压缩分区策略介绍,很赞。大力推荐!

  社区系列文章:

新数仓系列:HBase关键能力和特性梳理

HBase 和 Cassandra的浅谈

新数仓系列:Hbase周边生态梳理(1)

HBase设计之rowkey设计



介绍

HBase中等对象(MOB---MediumObject)存储特性引入是源自社区HBASE-11339

对于中等大小的文档、图像等文件的存储(文件大小从100K到10MB)。可降低读取延迟和写入訪问时间[1]。

通过分离文件的IO路径和MOB文件对象。对文件採取不同的压缩策略,从而降低因为HBase压缩造成的写入扩大。

若一个表的MOB文件存储在MOB区域(MOB region)中,则意味着该区域中将存在大量的MOB文件。请參考下图中HBase MOB架构。

 

 

HBase 的MOB压缩分区策略介绍

MOB体系结构

 

从上图我们能够看出MOB文件相对较小(小于1或者2个HDFS块)。为了提高HDFS的效率。通过MOB压缩方法将MOB文件定期合并为较大的文件,而且这样的压缩方法与正常的压缩过程相互独立。MOB压缩最初是将当天多个MOB文件合并为较大的MOB文件。通过以下演示样例我们能够更清楚了解这一过程。表t1有两个两个分区(r1,r2),一个列族f1,而且启用了MOB功能。

你能够看到例如以下两个前缀:

D279186428a75016b17e4df5ea43d080  相应分区r1startkey的散列值

D41d8cd98f00b204e9800998ecf8427e  相应分区r2startkey的散列值

 

MOB区域中,从2016.1.1-2016.1.2。r1分区中每天有两个MOB文件。2016.1.1当天。分区r2中有三个MOB文件

通过MOB压缩后,r1r2分区中同一日期的文件合并为一个文件,例如以下:

 

HBase 的MOB压缩分区策略介绍

 

因为仅仅有在同一区而且为同一天的MOB文件才可压缩。因此在一个MOB区域中的文件夹下一年产生的MOB文件数量为365乘以分区数目。若有1000个分区,通过MOB压缩,10年后将会有365 x 1000 x 10,3.65(百万)个文件产生而且文件数量会一直增长。可是,因为HDFS中一个文件夹下文件存储受限[2]。若MOB文件数超过HDFS限制后。MOB表将不再可写入文件。HDFS的一个文件夹下默认的最大文件数为100万,那么对于1000个分区来说,文件存储数目将在3年左右达到这个极限值。

分区越多,最大文件数会越快达到这个极限。

 

HBASE-16981引入按周和月的MOB压缩分区策略。对此MOB文件存放比例相应提高了7%和30%。

HBASE-16981基本思路是将一周或者一个月的MOB文件压缩合并为更大的文件。

依据ISO8601定义的周(起始为周一结束为周日),若採用周策略进行MOB压缩后,则每一个分区每周会产生一个文件,同理,用压缩方法按月压缩,每月会生成一个文件,终于在一个MOB区域文件夹下的文件数分别为52 乘以分区数和12乘以分区数。这样就大大降低了压缩后MOB文件的数量。

 

最初的方法

 

依据MOB压缩发生的频率,文件可能多次被压缩。比如。第一天全部的MOB文件被压缩为一个文件。第二天将第一天和第二天的MOB文件压缩为一个新的文件,第三天将第二天和第三天产生的文件压缩为一个新文件。以此类推,一个月后,第1天的文件压缩会超过30次,因此也就将写的IO数量扩大了30倍以上。

HBase MOB的设计目标是降低因为MOB压缩而导致的写入扩大。上述的这样的方法没能达到设计目标。

 

终于的方法

为了克服最初提出方案的不足,在HBASE-16981中採用了新的按周和月压缩策略。

图2展示了怎样按月压缩策略。同一时候按周压缩策略与此相似。

 

HBase 的MOB压缩分区策略介绍

 

图2 按月MOB压缩策略

 

图2所看到的的MOB压缩发生在2016.11.15。

依据配置的MOB阈值,每日分区中的文件按周进行压缩。上图中11.14和11.15的两天的文件各自压缩。

当前月份(11月)中过去的几周的文件基于每周阈值分区进行压缩(MOB阈值 x 7)。如11.1-11.6和11.7-11.13的文件分别压缩。11月之前的文件按月进行压缩,比如10.1-10.31文件压缩在一起。须要注意的是11月的第一周是从10.31-11.6结束。

因为2016.10.31是10月的最后一天。因此当天的文件压缩是依照月分区进行压缩,这样11月的第一周压缩的天数仅仅剩下6天(11.1-11.6),假设MOB压缩阈值和压缩大小设置合理,那么第一周会有5个压缩文件。

 

通过这样的设计模式,MOB文件能够通过2个阶段或3个阶段完毕压缩。在每一个阶段,日、周、月分区都会随着MOB压缩阈值的添加而变化。通常情况下。MOB文件按月最多3次压缩,按周最多压缩2次。

具体的设计细节能够參考[3]。

 

使用方法

在默认情况下。MOB压缩分区策略是每日一次。

若要用周或月策略,能够在MOB列族中加入了一个新属性字段:MOB_COMPACT_PARTITION_POLICY。用户可通过HBase shell创建表时设置该属性。比如:

HBase 的MOB压缩分区策略介绍

 

同一时候也能够改变该属性字段值

HBase 的MOB压缩分区策略介绍

假设压缩策略从每日改为每周或每月,或从每周改为每月。则下一个MOB压缩将又一次压缩之前压缩的MOB文件。假设策略从每月或每周改为每日或每月更新。则对已使用先前策略压缩的MOB文件将不会与新策略再次运行压缩。

 

结束语

HBASE-16981攻克了文件数大量添加的问题。并在Apache HBase 2.0.0版本号中使用。CDHCDH5.4.0+及以后的版本号開始使用HBase MOB特性。当中从5.11.0開始使用HBASE-16981修复的版本号。

 

因为译者水平有限,有翻译不当之处还请大大家多多指出。互相学习。