CentOS环境下HBase调优指南
hbase.regionserver.heapsize设置为物理内存的50%-70%,并为操作系统预留10%以上内存。swapoff -a永久禁用,并修改/etc/fstab文件注释掉swap行。sudo blockdev --setra 32768 /dev/sda(将磁盘预读扇区数设置为32768,约16MB)。sysctl -w vm.swappiness=0,禁止系统将内存页交换到磁盘,避免因内存不足导致的性能崩溃。ulimit -n 65535临时调整,修改/etc/security/limits.conf永久生效(添加* soft nofile 65535; * hard nofile 65535)。-Xms8g -Xmx8g(初始堆与最大堆一致,避免频繁扩容);若使用G1GC(推荐32GB以上内存),添加-XX:+UseG1GC -XX:MaxGCPauseMillis=200(目标最大GC停顿时间200ms)。hbase.regionserver.blockcache.size=0.5),MemStore占比40%(hbase.regionserver.memstore.size=0.4);写多读少场景则相反(BlockCache 40%、MemStore 50%)。需满足LRUBlockCache + MemStore < 80% * JVM_HEAP(如8GB堆内存,两者之和不超过6.4GB)。hbase.offheapcache.percentage=0.3(占堆外内存的30%),适用于大内存集群。hbase shell的create命令指定SPLITS参数(如create 'user', 'cf', SPLITS => ['1000', '2000', '3000']),或使用getHexSplits方法均匀分割Region,避免后续数据倾斜。StripeCompactionPolicy(减少读放大,提升读性能);DateTieredCompactionPolicy(合并近期数据,减少小文件数量);hbase.hstore.compaction.ratio=1.2(合并阈值,大于1.2的文件会被合并)、hbase.hstore.compaction.min=3(最小合并文件数)、hbase.hstore.compaction.max=10(最大合并文件数)。ASYNC(hbase.regionserver.hlog.blocksize=134217728,增大WAL块大小)或SKIP_WAL(仅适用于批量导入),减少WAL写入开销。hfile.block.cache.size=0.4),提升热点数据的读取命中率;对于频繁访问的小文件,可启用BucketCache(堆外缓存),设置hbase.bucketcache.ioengine=offheap(堆外内存引擎)、hbase.bucketcache.size=8g。hbase.regionserver.compression.codec=snappy),压缩比约为3:1(Snappy)或4:1(LZ4),减少磁盘I/O和网络传输量;注意:压缩会增加CPU负载,需根据CPU资源调整。hbase.hcolumnfamily.bloomfilter.enabled=true),减少随机读取时的磁盘IO(降低约30%-50%),适用于读多写少的场景。MD5(userId).substring(0, 4) + userId,将数据均匀分布到不同Region;Long.MAX_VALUE - timestamp + "_" + userId,使新数据集中在Region尾部,提升热点数据的写入性能;hbase.hregion.max.filesize=10737418240,每个Region最大10GB),减少MemStore flush和Compaction的开销;列族名称尽量简短(如cf代替user_info),降低存储开销。hbase.hcolumn.family.max.versions=3,保留最近3个版本),避免历史版本占用过多存储;对于时效性数据(如日志),设置TTL(hbase.hcolumn.family.ttl=2592000,30天过期),自动清理旧数据。htable.put(List<Put>)和htable.get(List<Get>)进行批量写入和读取,减少RPC调用次数(如批量大小设置为500-1000条),提升吞吐量。Scan.setCaching(500)(默认100),减少客户端与RegionServer之间的RPC交互次数;避免使用Scan.setStartRow()和Scan.setStopRow()进行全表扫描,尽量通过RowKey前缀过滤。Get.addColumn(Bytes.toBytes("cf"), Bytes.toBytes("name")))或列,避免加载不必要的数据,减少网络传输和内存消耗。hbase-regionserver.log(位于$HBASE_HOME/logs目录),分析慢查询(如SlowLogThreshold参数设置为1000ms,记录超过阈值的查询)、RegionServer异常(如OOM、GC时间过长)。major_compact(hbase shell> major_compact 'table_name')合并HFile文件,减少文件数量;清理无用数据(如TTL过期的数据),释放存储空间。