1. 存储层优化
优先使用SSD/NVMe替代传统HDD,显著提升随机读写性能(HBase对I/O敏感);确保磁盘有足够的空闲空间(建议预留20%以上),避免因磁盘空间不足导致写入阻塞。
2. 内存分配
根据集群规模分配充足内存:RegionServer堆内存建议≥8GB(兼顾读写场景可设为16GB及以上);若读多写少,可适当增加BlockCache占比(见下文配置)。
3. CPU配置
选择多核处理器(如Intel Xeon系列,建议≥8核),提升并发处理能力;避免单核瓶颈。
4. 网络优化
使用千兆及以上以太网卡(建议万兆网卡),确保节点间通信带宽充足;避免网络成为数据传输瓶颈。
5. 系统内核参数调优
/etc/rc.local确保重启生效:echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
echo vm.swappiness=0 | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
/var/lib/hbase)使用noatime或relatime,减少不必要的磁盘I/O:/etc/fstab,添加noatime选项(例如:UUID=xxxx /var/lib/hbase ext4 defaults,noatime 0 2),然后执行mount -o remount /var/lib/hbase。1. RegionServer内存管理
hbase-env.sh,设置RegionServer堆内存(如8GB):export HBASE_REGIONSERVER_HEAPSIZE=8G
hbase.regionserver.global.memstore.upperLimit:控制所有Region的MemStore总大小(默认0.4,写多读少场景建议0.45,避免频繁flush);hbase.regionserver.blockcache.size:设置BlockCache占比(读多写少场景建议0.6-0.8,写多读少建议0.3-0.5)。2. Region与HFile设置
hbase.hregion.max.filesize调整(默认10GB,建议5-20GB,平衡负载均衡与管理开销);避免Region过小导致频繁split,或过大导致单Region负载过高。<property>
<name>hbase.hfile.block.size</name>
<value>65536</value> <!-- 64KB -->
</property>
3. WAL(Write-Ahead Log)调优
hbase.regionserver.wal.async.sync=true);hbase.regionserver.wal.enablecompression=true,推荐使用Snappy算法,平衡压缩速度与压缩率)。4. 并发处理优化
hbase.regionserver.handler.count调整(默认30,建议80-128,应对高并发请求);hbase.regionserver.thread.compaction.small(小文件合并线程,默认10,写高负载时可调大至20)。1. RowKey设计
2025111101转为10120251111),确保数据均匀分布在Region中;cf1、cf2);cf),避免特殊字符增加解析开销。NUMREGIONS和SPLITALGO参数预先分割Region,避免数据集中写入单个Region(示例:创建10个Region,使用十六进制分割):create 'my_table', 'cf', {NUMREGIONS => 10, SPLITALGO => 'HexStringSplit'}
1. 批量操作
Put列表批量提交(减少RPC次数),示例代码:List<Put> puts = new ArrayList<>();
for (Data data : dataList) {
Put put = new Put(Bytes.toBytes(data.getRowKey()));
put.addColumn(Bytes.toBytes("cf"), Bytes.toBytes("column"), Bytes.toBytes(data.getValue()));
puts.add(put);
}
table.put(puts);
Scan.setBatch()设置批量获取条数(如1000),减少客户端与RegionServer交互(示例:scan.setBatch(1000))。Scan.setCaching()设置(默认100,建议500-1000,减少RPC次数);Scan.addFamily()或Scan.addColumn()限制扫描范围,避免全表扫描(示例:scan.addFamily(Bytes.toBytes("cf")));scan.setBlockCache(false),避免缓存占用内存。PrefixFilter、RowFilter等减少扫描数据量(示例:Filter filter = new PrefixFilter(Bytes.toBytes("prefix")); scan.setFilter(filter);)。1. 数据压缩
Snappy(压缩/解压速度快,适合HBase)或LZO(压缩率适中),通过alter命令设置:alter 'my_table', {NAME => 'cf', COMPRESSION => 'SNAPPY'}
2. 数据编码
FAST_DIFF(减少存储空间,提高读取效率),设置示例:alter 'my_table', {NAME => 'cf', DATA_BLOCK_ENCODING => 'FAST_DIFF'}
G1GC(适合大内存场景,减少GC停顿时间),编辑hbase-env.sh:export HBASE_OPTS="$HBASE_OPTS -XX:+UseG1GC"
1. 写缓存优化
hbase.client.write.buffer(默认2M,推荐6M,减少RPC次数;不宜过大,避免内存溢出)。hbase.client.scanner.caching(默认1,建议50-100;大Scan场景可设为1000,避免占用过多客户端与RegionServer内存)。hbase.client.cache.enabled(默认true),缓存Region位置信息,减少Meta表查询次数。