机器概况
- 总内存:256G
- 可分配内存:256*0.75=192G
- 总硬盘:1.8T*12=21.6T
- 可用硬盘空间:21.6T*0.85=18.36T
内存规划
Disk / Java Heap Ratio
Disk / Java Heap Ratio=Disk Size / Java Heap = RegionSize / MemstoreSize * ReplicationFactor * HeapFractionForMemstore * 2
一台RegionServer上1bytes的Java内存大小需要搭配多大的硬盘大小最合理。
公式解释:
- 硬盘容量维度下Region个数: Disk Size / (RegionSize *ReplicationFactor)
- Java Heap维度下Region个: Java Heap * HeapFractionForMemstore / (MemstoreSize / 2 )
- 硬盘维度和Java Headp维度理论相等:Disk Size / (RegionSize *ReplicationFactor) = Java Heap * HeapFractionForMemstore / (MemstoreSize / 2 ) => Disk Size / Java Heap = RegionSize / MemstoreSize * ReplicationFactor * HeapFractionForMemstore * 2
默认配置:
- RegionSize: hbase.hregion.max.filesize=10G
- MemstoreSize: hbase.hregion.memstore.flush.size=128M
- ReplicationFactor: dfs.replication=3
- HeapFractionForMemstore: hbase.regionserver.global.memstore.lowerLimit = 0.4
计算为:10G / 128M * 3 * 0.4 * 2 = 192,即RegionServer上1bytes的Java内存大小需要搭配192bytes的硬盘大小最合理。
默认配置为例,新集群可用内存为192G,即对应的硬盘空间需要为192G * 192 = 36T
默认配置下1:192,硬盘空间不足,可以将内存减少,通过修改HBase配置将多余的内存资源分配给HBase读缓存的BucketCache,这样就可以保证Java Heap并没有实际浪费。
读缓存BucketCache
BucketCache模式下HBase的内存布局如图所示:
该模式主要应用于线上读多写少型应用,整个RegionServer内存(Java进程内存)分为两部分:JVM内存和堆外内存。
- 读缓存CombinedBlockCache = LRUBlockCache + 堆外内存BucketCache,用于缓存读到的Block数据
- LRUBlockCache,用于缓存元数据Block
- BucketCache用于缓存实际用户数据Block
- 写缓存MemStore,缓存用户写入KeyValue数据
- 其他部分用于RegionServer正常运行所必须的内存
配置说明
RegionServer 堆栈大小为192G
Java_Heap大小为72G
- dfs.replication=3: hdfs副本数
- hbase.hregion.max.filesize=18G: Region大小
- hbase.hregion.memstore.flush.size=256M: Memstore刷新大小
- hbase.regionserver.global.memstore.upperLimit=0.58: 整个RS中Memstore最大比例
- hbase.regionserver.global.memstore.lowerLimit=0.53: 整个RS中Memstore最小比例
- hbase.bucketcache.ioengine=offheap: 使用堆外缓存
- hbase.bucketcache.size=(118+16) * 1024M: 堆外缓存大小,单位为M
- hbase.bucketcache.percentage.in.combinedcache=0.88: 堆外读缓存所占比例,剩余为堆内元数据缓存大小
- hfile.block.cache.size=0.2: 校验项
- hbase.regionserver.handler.count=100: RS处理客户端请求最大线程数
- hbase.hstore.blockingStoreFiles=100: storefile个数达到该值则block写入
- hbase.hregion.memstore.block.multiplier=3: 强制刷新Memstore大小的倍数
校验项
- LRUBlockCache + MemStore < 80% * JVM_HEAP -> (16+40)/72=0.77 <= 0.8
- RegionSize / MemstoreSize * ReplicationFactor * HeapFractionForMemstore * 2 -> 18 * 1024 / 256 * 3 * 0.58 * 2 = 250 -> 72G * 250 = 18T <= 18T
- Memstore可能的最大大小 -> 341 * 256 / 1024 = 85.25G > 41.76G
- hfile.block.cache.size + hbase.regionserver.global.memstore.upperLimit = 0.78 <= 0.8
可能存在的风险:Memstore数量同时存在160个以上且写满,将会出现RegionServer级别的强制刷写,造成节点阻塞。
其他
hbase-env.sh 的 HBase 客户端环境高级配置代码段
1 | HBASE_OFFHEAPSIZE=??G |
hbase-site.xml 的 RegionServer 高级配置代码段(安全阀)
手动split region
1 | <property><name>hbase.regionserver.wal.codec</name><value>org.apache.hadoop.hbase.regionserver.wal.IndexedWALEditCodec</value></property><property><name>hbase.region.server.rpc.scheduler.factory.class</name><value>org.apache.hadoop.hbase.ipc.PhoenixRpcSchedulerFactory</value><description>Factory to create the Phoenix RPC Scheduler that uses separate queues for index and metadata updates</description></property><property><name>hbase.rpc.controllerfactory.class</name><value>org.apache.hadoop.hbase.ipc.controller.ServerRpcControllerFactory</value><description>Factory to create the Phoenix RPC Scheduler that uses separate queues for index and metadata updates</description></property><property><name>hbase.regionserver.thread.compaction.large</name><value>5</value></property><property><name>hbase.regionserver.region.split.policy</name><value>org.apache.hadoop.hbase.regionserver.ConstantSizeRegionSplitPolicy</value></property> |