要启用内存压缩,则对每个你想要启用内存压缩的列簇设置 _IN_MEMORY_COMPACTION_配置项。IN_MEMORY_COMPACTION 配置项的值可以为下面四个中任意一个。

  • NONE: 不启用内存压缩.

  • BASIC: 基本策略开启后,会在内存中一直保持一个flush管道,直到我们超过管道最大阈值,然后我们就会flush到磁盘。虽然没有内存压缩操作,但仍然可以帮助提高吞吐,因为数据从空间效率不高的原生ConcurrentSkipListMap数据类型转移到更紧凑(和高效)的数据类型。

  • EAGER: 这是 _BASIC_策略加上对flush操作的内存压缩组合(非常像磁盘上hfile的compaction);当执行内存压缩时,使用的与磁盘上释放过期版本,冗余数据,超时数据等规则一样。

  • ADAPTIVE: 对负载进行自适应压缩操作。它会根据数据中重复单元格的比例来判断是否需要执行索引压缩或者数据压缩。

想要在表格 _radish_的 _info_列簇中应用 _BASIC_策略,需要先禁用表,然后给 _info_列簇增加属性,操作如下:

hbase(main):002:0> disable 'radish'
Took 0.5570 seconds
hbase(main):003:0> alter 'radish', {NAME => 'info', IN_MEMORY_COMPACTION => 'BASIC'}
Updating all regions with the new schema...
All regions updated.
Done.
Took 1.2413 seconds
hbase(main):004:0> describe 'radish'
Table radish is DISABLED
radish
COLUMN FAMILIES DESCRIPTION
{NAME => 'info', 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', COMPRESSION => 'NONE', BLOCKCACHE => 'true', BLOCKSIZE => '65536', METADATA => {
'IN_MEMORY_COMPACTION' => 'BASIC'}}
1 row(s)
Took 0.0239 seconds
hbase(main):005:0> enable 'radish'
Took 0.7537 seconds

注意 _IN_MEMORY_COMPACTION属性是作为 _METADATA_映射里的一部分。

还有一个全局配置 hbase.hregion.compacting.memstore.type,可以在 _hbase-site.xml_文件里设置。可以用这个来设置新创建表的默认策略(在创建列簇存储时,我们首先看列簇配置中 _IN_MEMORY_COMPACTION_配置,如果没有,我们将查询 _hbase.hregion.compacting.memstore.type_的值作为配置值,其默认是 _BASIC_策略)。

默认情况下,新的hbase系统表将会被设置为 _BASIC_内存压缩策略。要另外指定,则在新表创建时,将 _hbase.hregion.compacting.memstore.type_设置为 NONE(注意,设置此值后之前创建的系统表不会改变;您将必须更改表以设置内存中属性为 NONE。)

内存flush发生的条件是通过将配置的Region flush大小(在表描述符中设置或从 hbase.hregion.memstore.flush.size 中读取)除以列簇数,然后乘以 hbase.memstore.inmemoryflush.threshold.factor 来计算,其默认值为0.014。

管道承载的flush次数会被控制在memstore的大小范围内,当然你也可以设置 hbase.hregion.compacting.pipeline.segments.limit 参数指定一个最大flush次数值,默认值是2。

创建列簇存储时,需要指定哪种memstore类型。在撰写本文时,有两种memstore类型,分别是旧式的使用 ConcurrentSkipListMap 来存放数据,然后flush到磁盘上的 DefaultMemStore ,新式的提供上述内存压缩机制的 CompactingMemStore。下面是一个配置 family 属性为 CompactingMemStore 类型的列簇存储日志行:

Note how the IN_MEMORY_COMPACTION attribute shows as part of the _METADATA_ map.
2018-03-30 11:02:24,466 INFO  [Time-limited test] regionserver.HStore(325): Store=family,  memstore type=CompactingMemStore, storagePolicy=HOT, verifyBulkLoads=false, parallelPutCountPrintThreshold=10

可以为CompactingMemStore类(org.apache.hadoop.hbase.regionserver.CompactingMemStore)打开TRACE级别日志来查看运行细节。