Hbase 学习(五) 调优

1.垃圾回收器调优

当咱们往hbase写入数据,它首先写入memstore当中,当menstore的值大于hbase.hregion.memstore.flush.size参数中设置的值后,就会写入硬盘。shell

在hbase-env.sh文件中,咱们能够设置HBASE_OPTS或者HBASE_REGIONSERVER_OPTS,后者只影响region server进程。数组

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"app

《hbase权威指南》推荐了上述的写法,下面是从网上搜的,原书中为何要这么设置的解释真心看不懂。负载均衡

-Xmx8g -Xms8g –Xmn128m :最大堆内存8G,最小堆内存8G,新生代内存-Xmn128m。性能

-XX:+UseParNewGC : 设置对于新生代的垃圾回收器类型,这种类型是会中止JAVA进程,而后再进行回收的,但因为新生代体积比较小,持续时间一般只有几毫秒,所以能够接受。优化

-XX:+UseConcMarkSweepGC :设置老生代的垃圾回收类型,若是用新生代的那个会不合适,即会致使JAVA进程中止的时间太长,用这种不会中止JAVA进程,而是在JAVA进程运行的同时,并行的进行回收。spa

-XX:CMSInitiatingOccupancyFraction :设置CMS回收器运行的频率,避免前两个参数引发JAVA进程长时间中止,设置了这个以后,不须要中止JAVA进程,可是会提升CPU使用率。设计

最后两句是输出详细的日志。日志


2.MemStore-Local Allocation Buffer

MemStore-Local Allocation Buffer,是Cloudera在HBase 0.90.1时提交的一个patch里包含的特性。它基于Arena Allocation解决了HBase因Region flush致使的内存碎片问题。orm

MSLAB的实现原理(对照Arena Allocation,HBase实现细节):

  • MemstoreLAB为Memstore提供Allocator。

  • 建立一个2M(默认)的Chunk数组和一个chunk偏移量,默认值为0。

  • 当Memstore有新的KeyValue被插入时,经过KeyValue.getBuffer()取得data bytes数组。将data复制到Chunk数组起始位置为chunk偏移量处,并增长偏移量=偏移量+data.length。

  • 当一个chunk满了之后,再建立一个chunk。

  • 全部操做lock free,基于CMS原语。

优点:

  • KeyValue原始数据在minor gc时被销毁。

  • 数据存放在2m大小的chunk中,chunk归属于memstore。

  • flush时,只须要释放多个2m的chunks,chunk未满也强制释放,从而为Heap腾出了多个2M大小的内存区间,减小碎片密集程度。

开启MSLAB

hbase.hregion.memstore.mslab.enabled=true // 开启MSALB 
hbase.hregion.memstore.mslab.chunksize=2m // chunk的大小,越大内存连续性越好,但内存平均利用率会下降,要比插入的单元格的数据大一些。 
hbase.hregion.memstore.mslab.max.allocation=256K // 经过MSLAB分配的对象不能超过256K,不然直接在Heap上分配,256K够大了。



3.压缩存储

直接上图吧,说多了没用。

image

推荐使用Snappy,性能最好,可是Snappy要单独安装,安装教程等我装成功了,再发一个文档出来吧。

4.优化Splits and Compactions

对于实时性要求稳定的系统来讲,不定时的split和compact会使集群的响应时间出现比较大的波动,所以建议把split和compact关闭,手动进行操做,好比咱们把hbase.hregion.max.filesize设置成100G(major compaction大概须要一小时,设置太大了,compaction会须要更多的时间),major compaction是必需要作的,群里有个网友给数据设置了过时时间,数据被逻辑删除了,可是没有释放硬盘空间,why?没有进行major compaction,最后是手动进行的合并。

5.平衡分布

在咱们设计rowkey的时候,在前面加上随机数,好比0rowkey-1,1rowkey-2,0rowkey-3,1rowkey-4,去前面加上个随机数,就会有负载均衡的效果,可是若是这样作了,某个机器的数据仍是比别的机器要多不少,这个怎么办呢?咱们能够手动调用move()方法,经过shell或者HBaseAdmin类,或者调用unassign()方法,数据就会转移了。

相关文章
相关标签/搜索