2019独角兽企业重金招聘Python工程师标准>>>
Hbase MOB介绍
HBase通常存取小于10K的数据性能很好,如果文件稍大点,比如中等文件的大小,大小在100K<10M之间,由于压缩会带来性能下降,会导致region不可用。
为了解决这个问题,HBase引入了对中等大小文件的支持,也就是Hbase MOB(The Moderate Object Storage)特性,或者叫Hbase对象存储。详见HBase-11339。
关于HBase MOB的介绍,可以参考一下几篇文章:
- HBase MOB介绍(一)
- HBase MOB介绍(二)
- HBase MOB分区压缩策略介绍
这个特性在HBase 2.0.0版本才被合入,由于现在还是Beta版本,所以不推荐使用。
如果你想使用这个特性,推荐使用以下版本:
- Cloudera - CDH 5.4.x及之后版本
- Hortonworks - HDP 2.5及之后版本
- 华为 - FusionInsight_HBase (不开源,通常在电信行业使用)
适用场景
这个特性适合将图片、文档、PDF、小视频存储到Hbase中。
典型的场景:
- 银行存取客户签字或扫描件。
- 交通部门存取过车图片。
MOB配置方法
- 启用HFile Version 3
在hbase-si te.xml添加属性
hfile.format.version 3
2. 将列指定为MOB类型
- IS_MOB 设置为true,将这个列存为MOB.
- MOB_THRESHOLD 设置阈值。超过阈值大小的文件,就被当成MOB对待。默认阈值为100KB。
HBase Shell语句:
hbase> create 't1', {NAME => 'f1', IS_MOB => true, MOB_THRESHOLD => 102400} hbase> alter 't1', {NAME => 'f1', IS_MOB => true, MOB_THRESHOLD => 102400}
如果用JAVA API,则代码如下:
HColumnDescriptor hcd = new HColumnDescriptor(“f”); hcd.setMobEnabled(true); hcd.setMobThreshold(102400L);
HBase MOB 缓存设置
属性 | 默认值 | 说明 |
---|---|---|
hbase.mob.file.cache.size | 1000 | 缓存文件数量 |
hbase.mob.cache.evict.period | 3600 | 缓存清理时间 |
hbase.mob.cache.evict.remain.ratio | 0.5f | float类型,0和1之间 |
MOB测试
$ sudo -u hbase hbase org.apache.hadoop.hbase.IntegrationTestIngestMOB \ -threshold 102400 \ -minMobDataSize 512 \ -maxMobDataSize 5120
手动压缩MOB文件
使用compact_mob和major_compact_mob.
第一个参数是表名,只传表名,则表中所有的MOB列都压缩。
第二个参数是列名,如果传入列名,则只压缩指定列。
hbase> compact_mob 't1' hbase> compact_mob 't1', 'f1' hbase> major_compact_mob 't1' hbase> major_compact_mob 't1', 'f1'
设置MOB压缩策略(按周/月压缩成一个文件)
默认每天的MOB压缩成一个文件。
Apache HDFS对同一个目录下的文件数量有内存限制。MOB文件的数量超过此HDFS限制后,MOB表不可再写入。 Apache HDFS单个目录默认最大文件数量为100万。
一年365天,每天一个文件,如果有1000个region,那么一年就产生36.5万个文件,3年就会超过这个限制。区域越多,达到极限的速度越快。
因此,如果需要,可以设置为每周的数据压缩成一个文件,或者每月的数据压缩成一个文件。
默认情况下,按天使用MOB压缩分区策略。要应用每周或每月策略,就需要为MOB列族添加了一个新属性MOB_COMPACT_PARTITION_POLICY。用户可以在HBase shell创建表时设置此属性。
create 't1', {NAME => 'f1', IS_MOB => true, MOB_THRESHOLD => 1000000, MOB_COMPACT_PARTITION_POLICY => 'weekly’}
用户还可以从HBase shell更改现有表的MOB_COMPACT_PARTITION_POLICY。
alter 't1', {NAME => 'f1', MOB_COMPACT_PARTITION_POLICY => 'monthly'}
如果策略从每天更改为每周或每月,或每周更改为每月,则下一个MOB压缩将重新压缩之前策略压缩过的MOB文件。如果策略从每月或每周更改为每天或每月,每周更新已经压缩的MOB文件与以前的策略不会被新策略重新压缩。
参考文献:
https://issues.apache.org/jira/browse/HBASE-11339
https://issues.apache.org/jira/browse/HBASE-16981
http://blog.cloudera.com/blog/2015/06/inside-apache-hbases-new-support-for-mobs/
https://blog.cloudera.com/blog/2017/06/introducing-apache-hbase-medium-object-storage-mob-compaction-partition-policies/
https://blog.cloudera.com/blog/2009/02/the-small-files-problem/
http://developer.huawei.com/cn/ict/Products/BigData/FusionInsightHD/HBase/SDK#section-1
https://www.cloudera.com/documentation/enterprise/5-4-x/topics/admin_hbase_mob.html
https://docs.hortonworks.com/HDPDocuments/HDP2/HDP-2.5.3/bk_data-access/content/ch_MOB-support.html