优化Ubuntu上的HBase需从硬件配置、内存管理、数据存储、Region规划、客户端操作、压缩策略、垃圾回收等多维度入手,以下是具体优化措施:
sysctl -w vm.swappiness=0(永久写入/etc/sysctl.conf)关闭内存交换,避免因磁盘交换导致的性能下降;修改/etc/security/limits.conf,增加HBase进程的文件描述符(nofile)和线程数(nproc)限制(如hadoop soft nofile 65535、hadoop hard nofile 65535),防止因资源不足导致的进程崩溃。HBase的内存分配直接影响读写性能,需合理划分读缓存(BlockCache)、写缓存(MemStore)和堆外内存:
hbase-env.sh中设置JVM堆大小(如export HBASE_HEAPSIZE=56G)和新生代大小(-Xmn22G);hbase-site.xml中配置读缓存(hfile.block.cache.size=0.5)、写缓存(hbase.regionserver.global.memstore.upperLimit=0.6)和堆外内存(hbase.bucketcache.size=24576,单位MB)。HColumnDescriptor columnDescriptor = new HColumnDescriptor("cf");
columnDescriptor.setCompressionType(Compression.Algorithm.SNAPPY);
tableDescriptor.addFamily(columnDescriptor);
admin.createTable(tableDescriptor);
HBaseAdmin.createTable方法指定预分区范围:byte[][] splitKeys = {Bytes.toBytes("1000"), Bytes.toBytes("2000"), Bytes.toBytes("3000")};
admin.createTable(tableDescriptor, splitKeys);
put(List<Put>)方法批量写入数据,减少网络开销和HBase的写入次数。scan.setCaching(100)设置每次RPC请求返回的行数(默认1),提高扫描效率,但需避免缓存过大导致内存溢出。family:qualifier)或列,减少不必要的数据读取,降低IO负载。-Xmn)为堆大小的1/3-1/2(如16GB堆设为7GB),避免年轻代频繁GC;-XX:CMSInitiatingOccupancyFraction=75),当老年代占用率达到75%时启动GC;-XX:+DisableExplicitGC),防止应用程序调用System.gc()导致的Full GC。jstat -gcutil <pid>或GC日志(-Xloggc:/path/to/gc.log)监控GC频率和耗时,及时调整参数。echo "major_compact 'table_name'" | hbase shell命令合并所有StoreFile,删除历史数据,减少文件数量(避免过多StoreFile导致的IO开销)。hbase.hstore.compactionThreshold(触发Minor Compaction的最小StoreFile数量,默认3)和hbase.hstore.compaction.max(每次Minor Compaction的最大文件数,默认10),平衡Compaction频率与性能。hbase-root-master-ubuntu.log、hbase-root-regionserver-ubuntu.log),定位异常(如Region分裂失败、Compaction卡顿)。以上优化措施需根据Ubuntu服务器的硬件配置(CPU、内存、磁盘)、业务场景(读密集/写密集/混合场景)和数据量进行调整,建议在测试环境中验证后再应用于生产环境。