hbase的优化点

来源:互联网 发布:拉丁美洲独立运动知乎 编辑:程序博客网 时间:2024/06/05 19:24

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'