先调大堆内存
默认的RegionServer的内存才1GB,而Memstore默认是占40%,所以分配给Memstore的才400MB,在实际场景下,很容易就写阻塞了。可以通过指定HBASE_HEAPSIZE参数来调整所有HBase实例(不管是Master还是RegionServer)占用的内存大小。
修改$HBASE_HOME/conf/hbase-env.sh为
export HBASE_HEAPSIZE=8G
这个参数会影响所有HBase实例,包括Master和Region。这样的话Master和RegionServer都会占用8GB,建议用Master和RegionServer专有的参数来分别设定他们的内存大小。
PermSize的调整
hbase-env.sh中
提示
这两句配置的意思是Master和RegionServer的永久对象区(Permanent Generation,这个区域在非堆内存里面)占用了128MB的内存。根据注释的意思是这个配置存在的意义是为了在JDK 7下可以安全运行实例,所以如果你用的是JDK 8可以删掉这两行,并且由于JDK 8已经去除了PermGen,所以设置了也没用。
分别调master和regionserver的堆内村内存
这样就把Master的JVM内存设置为4GB,把RegionServer的内存设置为8GB了。
提示:永远至少留10%的内存给操作系统来进行必要的操作。
如何根据机器的内存大小设置合适的Master或者RegionServer的内存大小
举例:
现在有一台16GB的机器,上面有MapReduce服务、RegionServer和DataNode(这三位一般都是装在一起的),那么建议按照如下配置设置内存:
2GB:留给系统进程。
8GB:MapReduce服务。平均每1GB分配6个Map slots + 2个
Reduce slots。
4GB:HBase的RegionServer服务。
1GB:TaskTracker。
1GB