一、与HBase性能有关的因素
1、导致HBase性能下降的因素
1)Jvm内存分配与GC回收策略(每个Java程序都会涉及到这一点)
2)与HBase运行机制相关的部分配置不合理
3)表结构设计及用户使用方式不合理
2、HBase数据存储过程
1)compact(合并):HBase写入时会先写入到memstore,当memstore达到一定的大小会flush到磁盘保存成HFile,
当HFile小文件太多会执行compact操作进行合并
a、说明:随着我们不停的写入数据,磁盘上的HFile就会越来越多,对于HBase来说当HStore只有一个HFile文件
查询效率才是最大的,因为HFile小文件太多的查询时的寻址时间就会越长,因此HBase就会通过合并已
有的HFile来减少读取数据的磁盘寻址时间,从而提高读取的速度,这个合并的过程叫做compact,但是
在执行compact的期间,就是阻塞数据的写入和读取,所以何时去执行compact是一个相当复杂的决策,
这也就是HBase的一个调优点,compact分为两种:
--minor compaction:选取一些小的、相邻的StoreFile将他们合并成一个更大的StoreFile
--major compaction:将所有的StoreFile合并成一个StoreFile,清理无意义的数据:比如被删除的数据、
TTL过期数据、版本号超过设定版本号的数据
b、什么时候会执行compact
--MemStore被flush到磁盘
--用户执行shell命令compact、major_compact或者调用了相应的API
--HBase后台线程周期性触发检查
2)split(分割):当Region的大小达到某一阀值之后,会执行split操作
--split:当一个region达到一定大小就会自动split成两个region
二、HBase性能优化策略一:服务端优化策略
1、Jvm设置与GC设置
2、hbase-site.xml部分属性配置
三、HBase性能优化策略二:常用优化策略(以实际需求为主)
1、预先分区优化
创建HBase表的时候会自动创建一个Region分区与其对应,但当一个Region过大时就会触发split操作,
所以在创建HBase表的时候预先创建一些空的Regions,这样就避免了split操作
2、RowKey优化
1)利用HBase默认排序特点,将一起访问的数据放到一起
2)防止热点问题,避免使用时序或者单调的递增递减等
3、Column优化
1)列族的名称和列的描述命名尽量简短
2)同一张表中ColumnFamily的数量不要超过3个
4、Schema优化
1)宽表:一种'列多行少'的表设计(事务性好)
2)高表:一种'列少行多'的表设计(查询效率好)
四、HBase性能优化策略三:HBase读/写性能优化
1、HBase写优化策略
1)同步批量提交 or 异步批量提交
2)WAL优化,是否必须,持久化等级
2、HBase读优化策略
1)客户端:Scan缓存设置,批量获取
2)服务端:BlockCache配置是否合理,HFile是否过多
3)表结构设计问题