介绍
HBase中等对象(MOB---MediumObject)存储特性引入是源自社区HBASE-11339。对于中等大小的文档、图像等文件的存储(文件大小从100K到10MB),可降低读取延迟和写入访问时间[1]。通过分离文件的IO路径和MOB文件对象,对文件采取不同的压缩策略,从而减少由于HBase压缩造成的写入扩大。若一个表的MOB文件存储在MOB区域(MOB region)中,则意味着该区域中将存在大量的MOB文件。请参考下图中HBase MOB架构。
MOB体系结构
从上图我们可以看出MOB文件相对较小(小于1或者2个HDFS块)。为了提高HDFS的效率,通过MOB压缩方法将MOB文件定期合并为较大的文件,并且这种压缩方法与正常的压缩过程相互独立。MOB压缩最初是将当天多个MOB文件合并为较大的MOB文件。通过下面示例我们可以更清楚了解这一过程。表t1有两个两个分区(r1,r2),一个列族f1,并且启用了MOB功能。你可以看到如下两个前缀:
D279186428a75016b17e4df5ea43d080 对应分区r1中startkey的散列值 D41d8cd98f00b204e9800998ecf8427e 对应分区r2中startkey的散列值
在MOB区域中,从2016.1.1-2016.1.2,r1分区中每天有两个MOB文件,2016.1.1当天,分区r2中有三个MOB文件
通过MOB压缩后,r1、r2分区中同一日期的文件合并为一个文件,如下:
由于只有在同一区并且为同一天的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展示了如何按月压缩策略,同时按周压缩策略与此类似。
图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在创建表时设置该属性。例如:
同时也可以改变该属性字段值
如果压缩策略从每日改为每周或每月,或从每周改为每月,则下一个MOB压缩将重新压缩之前压缩的MOB文件。如果策略从每月或每周改为每日或每月更新,则对已使用先前策略压缩的MOB文件将不会与新策略再次执行压缩。
结束语
HBASE-16981解决了文件数大量增加的问题,并在Apache HBase 2.0.0版本中使用。CDH的CDH5.4.0+及以后的版本开始使用HBase MOB特性,其中从5.11.0开始使用HBASE-16981修复的版本。
由于译者水平有限,有翻译不当之处还请大大家多多指出,互相学习。
作者:中国HBase技术社区
链接:https://www.jianshu.com/p/ec5e7745bdb8