HBase 2.0 MOB
HBase MOB主要解决的是100KB--10MB文件保存。MOB的引入,使得HBase非常适合存储图片、文件、短视频等二进制对象。
MOB之前,也可以保存100KB以上的文件,但是HBase性能比常差,理论上MOB二进制对象大小应该在100KB--10MB之间,超过10MB的文件HBase也能进行存储但是效率相对比较低,不过可以采用切割文件的方式,把文件分为小于10M大小的文件进行保存,获取时候再进行合并。超过100M的文件,建议直接存放在HDFS上。
版本支持
HBase MOB是HBase 2.0 版本引入的功能,因此Apache HBase要2.0及以上版本才支持。
CDH5.4.x版本开始支持MOB
HDP2.5.x版本开始支持MOB
通过修改hbase-site.xml中hfile.format.version属性值为 3:
在HBase 2.0中3是默认配置。
IS_MOB:设置为true
MOB_THRESHOLD:设置MOB阈值,超过阈值的被当做MOB存储,默认100KB。
hbase(main):005:0> create 'test141', {NAME => 'f2', IS_MOB => true, MOB_THRESHOLD =>102400}
hbase(main):005:0> alter 'test141', {NAME => 'f2', IS_MOB => true, MOB_THRESHOLD =>102400}
hbase(main):006:0> describe 'test141'
{NAME => 'f2', MOB_THRESHOLD => '102400', VERSIONS => '1', EVICT_BLOCKS_ON_CLOSE => 'false', NEW_VERSION_BEHAVIOR => 'false', KEEP_DELETED_CELLS => 'FALSE', CACHE_DATA_ON_WRITE => 'false', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', MIN_VERSIONS => '0', REPLICATION_SCOPE => '0', BLOOMFILTER => 'ROW', CACHE_INDEX_ON_WRITE => 'false', IN_MEMORY => 'false', CACHE_BLOOMS_ON_WRITE => 'false', PREFETCH_BLOCKS_ON_OPEN => 'false', IS_MOB => 'true', COMPRESSION => 'NONE',
BLOCKCACHE => 'true', BLOCKSIZE => '65536'}
def modifyColumnFamily2_0(conn: Connection, admin: Admin, tableName: String, familyName: String*): Unit = {
try {
admin.disableTable(TableName.valueOf(tableName))
for (cf <- familyName) {
val cdb = ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes(cf))
cdb.setMaxVersions(1)
cdb.setMobEnabled(true)
cdb.setMobThreshold(102400)
val cfd: ColumnFamilyDescriptor = cdb.build()
admin.modifyColumnFamily(TableName.valueOf(tableName), cfd)
}
}
catch {
case exception: Exception =>
exception.printStackTrace()
} finally {
admin.enableTable(TableName.valueOf(tableName))
}
}
HBase会定期做压缩,默认值按天处理。
另外,HBASE-16981又引入了按周和月的MOB压缩聚合策略,改善了MOB的存储(CDH HBase自CDH5.11.0开始支持HBASE-16981修复的版本)。
通过属性MOB_COMPACT_PARTITION_POLICY设置不同的压缩聚合策略,可选值有daily、weekly和monthly,例如:
hbase(main):007:0> alter 'test141', {NAME => 'f2', IS_MOB => true, MOB_THRESHOLD =>102400,MOB_COMPACT_PARTITION_POLICY =>'weekly'}
hbase(main):008:0> describe 'test141'
{NAME => 'f2', MOB_THRESHOLD => '102400', VERSIONS => '1', EVICT_BLOCKS_ON_CLOSE => 'false', NEW_VERSION_BEHAVIOR => 'false', KEEP_DELETED_CELLS => 'FALSE', CACHE_DATA_ON_WRITE => 'false', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER'
, MIN_VERSIONS => '0', REPLICATION_SCOPE => '0', BLOOMFILTER => 'ROW', CACHE_INDEX_ON_WRITE => 'false', IN_MEMORY => 'false', CACHE_BLOOMS_ON_WRITE => 'false', PREFETCH_BLOCKS_ON_OPEN => 'false', IS_MOB => 'true', COMPRESSION => 'NONE',BLOCKCACHE => 'true', BLOCKSIZE => '65536', MOB_COMPACT_PARTITION_POLICY => 'WEEKLY'}
为了提高MOB读取的性能,服务端会保留一级LRU缓存,参数设置:
hbase.mob.file.cache.size:缓存MOB文件的数量,默认1000;
hbase.mob.cache.evict.period:缓存清理周期,默认是3600s;
hbase.mob.cache.evict.remain.ratio:缓存清理后保留文件的比例,取值范围为0~1,默认0.5f。