HBase集群配置

简介

HBase是一个高可靠、高性能、面向列、可伸缩的分布式存储系统,利用HBase技术可在廉价的PC Server上搭建大规模结构化存储集群。

HBase是Google BigTable的开源实现,与Google BigTable利用GFS作为其文件存储系统类似,HBase利用Hadoop HDFS作为其文件存储系统;

Google运行MapReduce来处理BigTable中的海量数据,HBase同样利用Hadoop MapReduce来处理HBase中的海量数据;

Google BigTable利用Chubby作为协同服务,HBase利用Zookeeper作为协同服务。

HBase整体架构如下:

hbase regionser hbase regionservers 内存配置_hbase

  • Zookeeper:集群元数据信息存储
  • HMaster:负责Region的分配,调度
  • RegionServer:负责处理数据的读写请求,客户端请求数据直接与Region Server交互
  • 存储:HDFS/本地存储/其他,HBase底层存储数据的地方

服务器选型

  • 集群承载量

集群的处理能力根据RegionServer进行横向扩展,可以先对单个RegionServer进行压测,确定单个RegionServer的QPS,根据总QPS/单个RegionServer的QPS,算出需要多少RegionServer。

  • 内存

HBase对内存的使用有两个方面:

1.写数据会先写入memstore中,然后再持久化到HDFS中

2.读数据会先读取内存的缓存,如果读不到再去HDFS中获取,然后将结果保存在内存中

建议配置较高内存,32GB起步

  • CPU型号和核数

核数与内存的比例关系建议1:4

  • 磁盘类型与容量

每条数据很大,对数据读取频繁建议SSD

写入频繁,读取压力不大的场景,选择机械硬盘即可。

容量的确定可以通过简单数据的压测进行估算确认。

  • 网络

主要保证副本间的数据同步网络带宽,假设一条数据10kb,每秒10w条数据的写入,则网络带宽需要10KB*10w/1024=976MB/s,如果副本数为3,则需要3*976MB/s=2929MB/s。

参数调优

操作系统层面

  • 文件句柄数设置65535
  • 最大虚拟内存,max_map_count:定义了进程拥有的最多内存区域,建议配置vm.max_map_count=102400
  • 关闭SWAP内存

应用层面

默认RegionServer的堆内存为1G,这里Memstore默认占40%,也就是400M,在实际场景中很容易因为Memstore太小导致阻塞,修改参数,在cong/hbase-env.sh:

export HBASE_HEAPSIZE=8G  // 建议修改为总内存的80%,预留一部分给操作系统

该参数会将Master和RegionServer的堆内存都设置为8G,所以有需要的话尽量使用专用的堆内存设置项:

export HBASE_MASTER_OPTS="$HBASE_MASTER_OPTS -Xms4g -Xmx4G"
export HBASE_REGIONsERVER_OPTS="$HBASE_REGIONSERVER_OPTS -Xms8g -Xmx8G"

开启G1垃圾回收器(JDK版本需要高于1.8)

-XX:+UseG1GC #使用G1GC
-Xms100g -Xmx100g #堆内存范围,这里写死为100G
-XX:MaxGCPauseMills=500 #G1GC最大的GC时间毫秒
-XX:ParallelRefProcEnabled #GC使用多线程在Young和mixed GC期间处理增加的引用
-XX:PaarallelGCThreads=8+(logical processors-8)(5/8) # 多线程回收策略,这里logical processors为40
-XX:-ResizePLAB #开启线程较多时候,该项可以关闭PLAB的大小调整,避免大量线程通信导致的性能下降
-XX:G1NewSizePercent=5 #年轻代最小值(占堆内存的比例),默认5%
-XX:G1NewSizePercent=3 #32GHeap
-XX:G1NewSizePercent=2 #64GHeap
-XX:G1NewSizePercent=1 #100G+Heap

hbase.regionserver.handler.count:默认10,此设置定义同时处理客户端请求的线程数。经验法则是,当每个请求的有效载荷接近MB(大put,使用大缓存进行扫描)时,保持这个数字较低(30-50);当有效载荷较小时(get,小put, ICVs, delete),保持这个数字较高(100-120)。正在进行的查询的总大小设置hbase.ipc.server.max.callqueue.size的限制。

当compaction文件总大小大于throttlePoint,则Compactions请求分配给largeCompaction处理,否则分配给hbase.regionserver.thread.compaction.small

hbase.regionserver.thread.compaction.small:4

hbase.regionserver.thread.compaction.large:6

hbase.regionserver.thread.compaction.throttle:2.5GB

hbase.hregion.max.filesize:StoreFile文件超过配置时会触发分裂操作,此参数不宜过大或过小,建议5-10GB

建议关闭major_compact,非高峰再进行major_compact 'table_name’操作

hfile.block.cache.size:regionserver的cache大小,可以提升查询性能,建议0.2,读取频繁设置0.5

hbase.hregion.memstore.flush.size:一个region对应一个hlog和多个store,一个store对应一个memstore和多个storefile,一个region下面的所有store里面的memstore达到多少时触发刷入磁盘操作

hbase.regionserver.global.memstore.size.lower.limit:一个regionserver上memstore总共可以使用的堆内存最小百分比

hbase.regionserver.global.memstore.size:一个regionserver上memstore总共可以使用的堆内存最大百分比

其他建议

  • 预创建分区
  • 数据压缩,建议snappy算法
  • cloudera监控

参考文档