HBase 内存管理理解


。_饼干妹妹 提交于 2020-01-14 23:09:22

1. 基础知识

1.1 Region Server内存布局

参考[2]
RS内存布局

1.2 堆内内存

  • 物理内存少于20G,建议只配置堆内内存
  • 配置参数:hbase-env.sh的参数HBASE_HEAPSIZE,默认1G
  • on-heap BlockCache的实现,称之为LruBlockCache,也称L1 Cache
  • 默认开启,可在表的列族级关闭,desc 'table'查看BLOCKCACHE => 'false'
  • 设置hbase.block.data.cachecompressedtrue可开启BlockCache压缩。性能影响HBASE-11331:吞吐率增加50%,延迟增加30%,gc增加80%,CPU负载增加2%。

1.3 堆外内存

  • 物理内存大于20G,建议配置堆外内存
  • off-heap BlockCache称为BucketCache,也称L2 Cache
  • 堆外内存总大小由-XX:MaxDirectMemorySize=20G参数配置,或者hbase-env.sh的参数HBASE_OFFHEAPSIZE
  • hbase.bucketcache.size配置BucketCache的占堆外内存比例(若<1.0)或大小(>=1,单位MB
  • hbase.bucketcache.ioengine设置为offheap开启BucketCache
  • BucketCache只保存数据块(DATA),元数据块(INDEX BLOOM)仍然保存在LruBlockCache
  • BucketCache可通过设置hbase.bucketcache.combinedcache.enabledfalse(默认true)作为LruBlockCache L1 Cache的纯L2 Cache,L1中替换的Block保存到L2,查询时先查询L1,L1未命中再查询L2。HBase 2.0开始移除了该特性。

1.4 读写比例

  • hfile.block.cache.size配置读内存BlockCache占堆内内存比例, 默认0.4,不建议配置为0,至少保证足够空间用于StoreFile索引
  • hbase.regionserver.global.memstore.size(新配置,默认为空),hbase.regionserver.global.memstore.upperLimit(旧配置,默认0.4)配置写内存Memstore占比
  • 读写总比例必需<= 0.8

内存配置思路

Hortonworks的参考资料[1][2]给出了详细且简单明了的配置建议。[3]在实践的基础上作了进一步的补充。

以[2]的示例说明,75%读25%写,因此LruBlockCache比例为0.8*75%=0.6,MemStore的比例0.8-06=0.2
在这里插入图片描述

参数配置如下:

#on-heap memory
HBASE_HEAPSIZE=20G

# 读写比例
hfile.block.cache.size=0.6
hbase.regionserver.global.memstore.size=0.2

# off-heap memory
hbase.bucketcache.ioengine=offheap
-XX:MaxDirectMemorySize=108G
# BucketCache大小。
# 个人认为[2]设置有误,其设置为BucketCache+LruBlockCache = 106G + 12G = 118G,已超出了堆外内存大小
hbase.bucketcache.size=108544

参考资料

工具导航Map