内存压缩
77.概述
内存压缩(A.K.A Accordion)是 hbase-2.0.0 中的一项新功能。它首先在 Accordion 的 Apache HBase 博客上推出:HBase 通过内存压缩进行呼吸。引用博客:
Accordion 将 LSM 主体[ Log-Structured-Merge Tree ,HBase 所基于的设计模式]重新应用于 MemStore,以便在数据仍在 RAM 中时消除冗余和其他开销。这样做可以降低冲洗到 HDFS 的频率,从而减少写入放大和整个磁盘占用空间。由于刷新次数较少,因此 MemStore 溢出时写入操作停止的频率降低,因此写入性能得到改善。磁盘上的数据越少,对块缓存的压力越小,命中率越高,最终读取响应时间越长。最后,具有较少的磁盘写入也意味着在后台发生较少的压缩,即,从生产(读取和写入)工作中窃取的循环较少。总而言之,内存压缩的效果可以被设想为催化剂,使系统整体上移动得更快。
开发人员视图可在 Accordion:内存压缩的开发人员视图中找到。
内存压缩在高数据流失时效果最佳;当数据仍在内存中时,可以消除覆盖或过度版本。如果写入都是唯一的,则可能会拖动写入吞吐量(内存中压缩成本 CPU)。我们建议您在部署到生产之前进行测试和比较。
在本节中,我们将介绍如何启用 Accordion 和可用的配置。
78.启用
要启用内存中压缩,请在您希望行为的每个列族上设置 IN_MEMORY _COMPACTION 属性。 IN_MEMORY _COMPACTION 属性可以具有四个值之一。
无 :无内存压缩。
BASIC :基本策略启用刷新并保持刷新管道,直到我们跳过管道最大阈值,然后我们刷新到磁盘。没有内存中的压缩,但可以帮助提高吞吐量,因为数据从挥霍的原生 ConcurrentSkipListMap 数据类型转移到更紧凑(和高效)的数据类型。
EAGER :这是 BASIC 政策加上内存压缩的冲洗(很像是对 hfiles 进行的盘上压缩);在压缩方面,我们应用磁盘规则来消除版本,重复,ttl’d 单元格等。
ADAPTIVE :自适应压缩适应工作负载。它根据数据中重复单元格的比例应用索引压缩或数据压缩。实验。
要在表 萝卜 中的 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
请注意 INMEMORY_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 )。
当内存中的刷新发生时,通过将配置的区域刷新大小(在表描述符中设置或从 hbase.hregion.memstore.flush.size 中读取)除以列族的数量然后相乘来计算 hbase.memstore.inmemoryflush.threshold.factor 。默认值为 0.014。
监视管道所承载的刷新次数,以便符合 memstore 大小调整的范围,但您也可以通过设置 hbase.hregion.compacting.pipeline.segments.limit 来设置总刷新次数的最大值 。默认值为 2。
创建列族 Store 时,它会说明哪些 memstore 类型有效。在撰写本文时,有一个老派 DefaultMemStore 填充 ConcurrentSkipListMap ,然后刷新到磁盘或新的 CompactingMemStore ,它是提供这个新功能的实现内存中压缩设施。以下是来自 RegionServer 的日志行,该日志行显示了一个名为 系列 的列族存储配置为使用 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 级别日志记录,以查看其操作的详细信息。