1. 硬件选择
2. 操作系统调优
echo never > /sys/kernel/mm/transparent_hugepage/enabled永久禁用;/etc/sysctl.conf,增加文件描述符限制(fs.file-max = 655360)、调整TCP窗口大小(net.core.rmem_max = 16777216、net.core.wmem_max = 16777216),提升网络与I/O吞吐量;noatime或relatime挂载文件系统(如mount -o remount,noatime /),减少不必要的磁盘写操作。1. 内存管理
hbase-env.sh中的HBASE_HEAPSIZE(如export HBASE_HEAPSIZE=8G),为RegionServer分配足够堆内存;hbase-site.xml设置hfile.block.cache.size(建议占堆内存的30%-50%,如0.4);hbase.regionserver.global.memstore.size(建议占堆内存的20%-30%,如0.25),避免频繁刷写HFile。2. Region与并发控制
hbase shell的pre-split命令或RegionSplitPolicy预定义Region数量(如create 'table_name', 'cf', SPLITS => ['1000', '2000', '3000']),避免数据集中导致的热点问题;hbase.hregion.max.filesize(建议10GB-20GB,如10737418240),平衡Region分裂频率与查询效率;hbase.regionserver.handler.count(建议100-200,根据客户端并发量调整),提升并发处理能力。3. 压缩与WAL
hbase.hstore.compression设为SNAPPY),减少磁盘存储空间与网络传输开销(压缩比约3:1-5:1),对读性能影响较小;hbase.regionserver.optionallogflushinterval(如1000ms),减少WAL写入延迟;hbase.hregion.memstore.flush.size(如134217728,128MB)控制MemStore刷写时机,避免频繁刷写。1. 行键设计
MD5(user_id).substring(0,4))、反转时间戳(如Long.MAX_VALUE - timestamp)或加盐(如salt + user_id)等方式,使行键均匀分布在不同Region;2. 列族设计
cf1、cf2),过多列族会增加HFile的元数据开销;cf_hot),冷数据放在另一列族(如cf_cold),便于针对性优化。1. 批量操作
Table.put(List<Put>)接口,将多个Put操作合并为一个RPC调用,减少网络开销(吞吐量可提升2-5倍);Table.get(List<Get>)接口,合并多个Get请求;设置Scan.setCaching(int)(如500),增加每次RPC返回的行数,减少RPC次数(适用于大Scan场景)。2. Scan优化
Scan.setCacheBlocks(false),避免大量数据进入BlockCache影响实时业务;Scan.addFamily(Bytes.toBytes("cf1"))或Scan.addColumn(Bytes.toBytes("cf1"), Bytes.toBytes("col1")),仅读取所需数据,减少I/O开销。1. 自动负载均衡
LoadBalancer(默认开启),通过hbase balancer命令手动触发,将Region均匀分布在集群RegionServer上,避免单节点过载。2. 副本与故障恢复
hbase.hregion.replication(默认3,可根据集群规模调整为2,减少存储与同步开销);hbase hbck命令修复元数据不一致)。http://master:16010)、RegionServer UI监控集群状态(如Region数量、读写延迟、缓存命中率);hbase_regionserver_*、hadoop_hdfs_*等指标,可视化分析性能瓶颈;hdfs dfs -expunge)、重建HFile索引(hbase hbck -j),保持集群健康状态。以上优化策略需结合实际业务场景(如读多写少、热点数据分布)调整,建议在测试环境验证后再应用于生产环境。