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整体架构如下:
-
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监控
参考文档
- https://hbase.apache.org/book.html#dyn_config
- https://www.jianshu.com/p/605086750c37
- http://www.uml.org.cn/bigdata/201810181.asp