HBase性能调优
一. 操作系统:
1.内存:
内存尽可能的大,不要饿着HBase。
2.64-bit
使用64位的操作系统。
3.Swapping
当心交换。swappiness设置为0。
Linux 移动那些一段时间没有被访问的内存页到 swap 空间,即使它由足够可用的内存。这叫做 swap out。换一句话说,从 swap 空间读 swapped out 的数据到内存中叫做 swap in。Swapping 在大多数情形是有必要的,但是因为 Java Virtual Machine(JVM) 在 swapping 下不是表现的很好,如果 swapped 了,HBase 运行可能会遇到问题。ZooKeeper 的 session 过期或许是 被 swap 引入的典型问题。
把vm.swappiness 设置成 0,这将使得内核避免把进程尽可能的从物理内存中交换出去。这对 HBase 是非常有用的,因为 HBase 的进程消费大量的内存,一个高的 vm.swappiness 值将使得 HBase 交换很多并遭遇非常慢的垃圾回收。随着 ZooKeeper session 超时,这可能会导致 RegionServer 进程被杀死。
如何修改swappiness:
查看
cat /proc/sys/vm/swappiness
修改
sysctlvm.swappiness=10
永久修改
echo"vm.swappiness = 10" >> /etc/sysctl.
conf
4.CPU
确保您已经设置了您的Hadoop使用本地的、硬件的校验和。(core-site.xml io.native.lib.available=true)
二.网络:
三.java
1.GC垃圾回收器
在HBase中有两种stop-the-world GC的情况: CMS(并发GC)失效模式和老年代碎片问题。
第一个问题:
启动CMS前,将-XX:CMSInitiatingOccupancyFraction参数设置为低于默认值(92),以60或70%启动(降低阈值越低,完成的GCing越多,使用的CPU越多)
第二个问题:
本地memstore分配缓冲区MSLAB --代价是更加浪费堆空间
缓解由于memstore的扰动(不断创建和释放内存空间)造成region server 内存碎片问题。
原理:只允许从堆中分配相同的对象。一旦这些对象分配并且最终被回收,他们将在堆中留下固定大小的孔洞。之后调用相同大小的新对象将会重新使用这些孔洞:这样就不会产生提升错误,因此就不需要应用程序停止压缩回收了。默认在0.92版中被启用,0.90版本未启用,可以修改参数:hbase.hregion.memstore.mslab.enabled来覆盖
要注意的是,当启用这个属性时,每个MemStore实例将至少占用一个内存实例。如果你在大量列族中都有成千上万个region,可能会浪费很大的堆空间,严重时导致OOME。在这种情况下要禁用MSLAB或者降低它的内存使用量,或者减少region server 中的region数量。
如果写压力过大,减少年轻代GC的配置。
在hbase-env.sh 中配置GC-xx:PretenureSizeThreshold小于hbase.hregion.memstore.mslab.chunksize(默认2M)的大小。
四.HBase 配置参数
1. hbase.regionserver.handler.count
hbase.regionserver.handler.count 该属性定义了响应外部用户访问数据表请求的线程数。默认值10,较大的写入和使用大缓存的扫描,设得小;而当单次请求开销较小时(如get,较小的put,increment和delete等操作)可以将工作线程数设得高一些。