Hbase的优化点
最近在总结hbase的相关内容,在此分享几个较为基础的优化点:
- GC配置
- flush阶段
- compact阶段
- split阶段
GC配置
GC配置也就是JAVA堆内存的垃圾回收,主要用于regionserver的垃圾回收,堆内存中分为三块区域:新生带,老年带,永生带。
新生带:一般存储刚刚生成的对象,一般存储空间较小
老年带:一般用于存储存活时间比较长的对象,一般空间较大
永生带:一般存储class信息和元数据(java1.8以后不用java堆内存来开辟永生带了,而是用了一块本地内存叫作元空间来代替永生带)
如果内存回收不及时就会产生GC停顿,为了避免GC停顿,我们可以根据新生带和老年带的垃圾回收特性配置不同的GC算法。新生带空间较小,回收速度较快,适合Parrallel New Collector;老年带空间较大,回收速度较慢,适合Concurrent Mark-Sweep Collector。
配置:将以下配置放入每台regionsever的hbase-env中
export HBASE_REGIONSERVER_OPTS="-Xmx8g -Xms8G
-Xmn128m -XX:UseParNewGC
-XX:UseConcMarkSweepGC
-XX:CMSInitiatingOccupancyFraction=70
-verbose:gc
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-Xloggc:$HBASE_HOME/logs/gc-${hostname}-hbase.log"
flush阶段
当单个memstore满128M或者memstore的总大小超过限制时(每个regionserver都拥有一个memstore,即memstore的总大小,regionserver中的每个region分配该memstore,即单个memstore)自动触发溢写(flush)操作,将memstore中的文件溢写成storefile
在工作中,我们可以关闭自动溢写,即将溢写的触发值调制最大(hbase.hregion.memstore.flush.size),并在定时在不影响业务的时间段,手动触发溢写:flush 'tablename'
regionserver所使用的内存由三部分:regionserver自身所用的内存、读内存(blockcache)、写内存(memstore),默认分配比例为2:4:4。
在hbase-site.xml中
写业务比较多,调大写内存:
<property >
<name>hbase.regionserver.global.memstore.size</name>
<value>0.4</value>
</property>
读业务比较多,调大读内存:
<property >
<name>hfile.block.cache.size</name>
<value>0.4</value>
</property>
compact阶段
溢写的storefile会将小文件合并(compact)成大文件,其中有两种合并方式:
1.minor compact:轻量级的合并
.将最早生成的几个小文件进行合并,变成一个大文件;
.不进行数据的更新和删除;
.频繁执行,轻量级的合并,消耗资源较少;
2.major compact:重量级的合并
.将当前所有的storefile合并成一个大文件
.会对标记为更新和删除的数据实施真正的删除
.定期执行:默认7天执行一次
在工作中我们可以关闭(compact):
<property >
<name>hbase.hregion.majorcompaction</name>
<value>0</value>
</property>
定时在不影响业务时间段手动执行:
major_compact 'tablename'
major_compact 'regionname'
split阶段
当整个region中的storefile达到阈值时,会触发自动split,
默认10G(hbase.hregion.max.filesize)
工作中关闭自动触发
关闭:
hbase.hregion.max.filesize=100GB
定时手动触发:
split 'tableName'
split 'regionName' # format: 'tableName,startKey,id'