堆内存是HBase运行的核心资源,需根据服务器物理内存合理分配(建议占物理内存的50%-70%,避免占用过多导致系统或其他服务内存不足)。
hbase-env.sh文件(位于$HBASE_HOME/conf目录):sudo vi $HBASE_HOME/conf/hbase-env.sh
HBASE_HEAPSIZE参数(如8GB内存服务器可设为6GB):export HBASE_HEAPSIZE=6G
sudo systemctl restart hbase-regionserver
MemStore用于缓存写入数据,其大小直接影响内存占用。需调整全局MemStore比例及上下限,避免频繁Full GC。
hbase-site.xml文件(位于$HBASE_HOME/conf目录):sudo vi $HBASE_HOME/conf/hbase-site.xml
<property>
<name>hbase.regionserver.global.memstore.size</name>
<value>0.4</value> <!-- 全局MemStore占堆内存的40%(2.4GB) -->
</property>
<property>
<name>hbase.regionserver.global.memstore.lowerLimit</name>
<value>0.38</value> <!-- 下限:38%(2.28GB),触发异步flush -->
</property>
<property>
<name>hbase.regionserver.global.memstore.upperLimit</name>
<value>0.42</value> <!-- 上限:42%(2.52GB),触发同步flush -->
</property>
sudo systemctl restart hbase-regionserver
读缓存用于缓存数据块,提升读取性能。建议将堆内存的50%分配给读缓存(其中10%为LRU缓存元数据,90%为BucketCache缓存用户数据)。
hbase-site.xml,添加以下参数:<property>
<name>hfile.block.cache.size</name>
<value>0.1</value> <!-- LRU缓存占堆内存的10%(0.6GB) -->
</property>
<property>
<name>hbase.bucketcache.ioengine</name>
<value>offheap</value> <!-- 使用堆外内存(offheap)避免GC影响 -->
</property>
<property>
<name>hbase.bucketcache.size</name>
<value>5184</value> <!-- BucketCache大小:5.184GB(堆外内存) -->
</property>
<property>
<name>hbase.bucketcache.percentage.in.combinedcache</name>
<value>0.9</value> <!-- BucketCache占组合缓存的90% -->
</property>
Swap分区会降低内存访问速度,对延迟敏感的HBase而言,建议关闭(仅在物理内存充足时操作)。
sudo swapon --show
sudo swapoff -a
/etc/fstab文件,注释掉swap相关行):sudo vi /etc/fstab
找到类似UUID=xxxxxx none swap sw 0 0的行,前面加#注释。vm.swappiness控制内核使用swap的积极性(0-100,默认60)。设为0表示尽量避免使用swap(仅在内存不足时触发)。
sudo sysctl -w vm.swappiness=0
/etc/sysctl.conf文件):sudo vi /etc/sysctl.conf
添加以下行:vm.swappiness=0
sudo sysctl -p
选择合适的垃圾回收器(如G1GC)可减少Full GC时间,避免因GC停顿导致内存不足。
hbase-env.sh,添加以下JVM参数:export HBASE_OPTS="$HBASE_OPTS -XX:+UseG1GC -XX:MaxGCPauseMillis=100 -XX:InitiatingHeapOccupancyPercent=45"
参数说明:
UseG1GC:启用G1GC收集器;MaxGCPauseMillis:目标最大GC停顿时间(毫秒);InitiatingHeapOccupancyPercent:触发并发GC的堆占用率阈值。使用监控工具(如Prometheus+Granafa、Ganglia)实时监控HBase内存使用情况(包括堆内存、MemStore、BlockCache等),根据业务增长动态调整参数(如增加RegionServer数量、扩大堆内存)。
hbase shell
status 'simple'
$HBASE_HOME/logs目录),分析内存瓶颈。以上步骤可逐步解决Ubuntu下HBase内存不足的问题,需根据实际服务器资源和业务负载调整参数,避免过度分配或不足。