分享知识,分享快乐

0%

hbase新集群配置项整理

机器概况

  • 总内存: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的内存布局如图所示:

image

该模式主要应用于线上读多写少型应用,整个RegionServer内存(Java进程内存)分为两部分:JVM内存和堆外内存。

  • 读缓存CombinedBlockCache = LRUBlockCache + 堆外内存BucketCache,用于缓存读到的Block数据
  • LRUBlockCache,用于缓存元数据Block
  • BucketCache用于缓存实际用户数据Block
  • 写缓存MemStore,缓存用户写入KeyValue数据
  • 其他部分用于RegionServer正常运行所必须的内存

配置说明

image

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
2
HBASE_OFFHEAPSIZE=??G
HBASE_OPTS="-XX:MaxDirectMemorySize=??G -Xmx??G -Xms??G -Xmn1g -Xss256k -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=256m -XX:+UseParNewGC -XX:MaxTenuringThreshold=15 -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:+CMSClassUnloadingEnabled -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSFullGCsBeforeCompaction=0 -XX:CMSInitiatingOccupancyFraction=70 -XX:+PrintTenuringDistribution -XX:SurvivorRatio=2 -XX:+UseConcMarkSweepGC -XX:-DisableExplicitGC $HBASE_OPTS"

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>