1. 操作系统级内存优化
vm.swappiness=0,避免HBase因内存不足而使用磁盘交换,减少I/O延迟和性能抖动。vfs_cache_pressure(建议设置为50-100)和min_free_kbytes(建议设置为物理内存的1-2%),平衡系统缓存与HBase内存的使用,避免系统过度回收HBase内存。2. JVM内存分配调优
HBASE_HEAPSIZE(如32GB内存节点可分配24-28GB),避免过大导致Full GC时间过长(建议不超过物理内存的70%)。-Xgcpolicy:gencon),减少停顿时间;-Xgcpolicy:balanced),提升吞吐量并降低Full GC频率。-XgcThreads=4,根据CPU核心数调整),缩短GC停顿时间。3. HBase核心内存参数配置
hbase.regionserver.global.memstore.size(默认0.4,即堆内存的40%),限制全局MemStore最大使用量,避免内存溢出;hbase.regionserver.global.memstore.lower.limit(默认0.38)和upper.limit(默认0.42),提前触发MemStore flush,减少突发写入导致的内存压力。hbase.regionserver.handler.count(建议设置为CPU核心数的1-2倍,如16核节点设置为16-32),提升并发处理RPC请求的能力,避免线程阻塞导致内存积压。4. 缓存策略优化
hfile.block.cache.size=0.4),缓存热点数据,提升读取性能;避免过大导致MemStore内存不足。global.memstore.size调至0.5,block.cache.size调至0.3。5. 数据存储与压缩优化
hbase.hregion.compress=true、hbase.hregion.compression.algorithm=snappy),减少内存中数据的存储占用,降低GC压力;压缩比约为2-3倍,对读性能影响较小。hbase.hregion.max.filesize(默认10GB,建议调整为64GB-128GB),增大HFile块大小(hbase.hregion.blocksize,建议64KB-128KB),减少文件数量,降低BlockCache的内存碎片和查找开销。6. 预分区与表设计优化
pre-split命令预先划分Region(如hbase shell> create 'table_name', 'cf', SPLITS => ['1000', '2000', '3000']),避免后续数据增长导致Region分裂,减少热点Region的内存压力。rowkey = hash(user_id) + user_id),避免数据倾斜到单个Region,导致该Region的MemStore内存占用过高。hbase.hregion.memstore.block.multiplier(默认2),控制单个列簇的MemStore大小,防止单个列簇占用过多内存。7. 监控与运维调优
http://regionserver:16010)或第三方工具(如Ganglia、Prometheus+Granafa),监控MemStore使用量、BlockCache命中率、GC时间等指标,及时发现内存瓶颈。-Xloggc:/path/to/gc.log、-XX:+PrintGCDetails),使用VisualVM、Java Mission Control等工具分析堆转储,定位内存泄漏(如未释放的缓存、大对象堆积)。hbase shell> major_compact 'table_name'),合并小文件,减少MemStore和BlockCache中的无效数据,提升内存使用效率。