1、什么导致HBase性能下降
Jvm内存分配与GC回收策略
与HBase运行机制相关的部分配置不合理
表结构设计及用户使用方式不合理
2、HBase数据存储过程
HBase写入时当memstore达到一定的大小会flush到磁盘保存成HFile,当HFile小文件太多会执行compact操作进行合并
当Region的大小达到某一阈值之后,会执行split操作
minor compaction:选取一些小的、相邻的StoreFile将他们合并成一个更大的StoreFile
major compaction:将所有的StoreFile合并成一个StoreFile,清理无意义数据:被删除的数据、TTL过期数据、版本号超过设定版本号的数据
split: 当一个region达到一定的大小就会自动split成两个region
3、HBase Compact检查
MemStore被flush到磁盘
用户执行shell命令compact、major_compact或者调用了相应的API
HBase后台线程周期性触发检查
4、HBase优化
常见服务端配置优化
常用优化策略(以实际需求为主)
HBasei读/写性能优化
5、HBase服务端优化
Jvm设置与GC设置
hbase-site.xml部分属性配置
HBase properties | 简介 |
hbase.regionserver.handler.count | rpc请求的线程数量,默认值是10 |
hbase.hregion.max.filesize | 当region的大小大于设定值后hbase就会开始split |
hbase.hregion.majorcompaction | major compaction的执行周期 |
hbase.hstore.compaction.min | 一个store里的storefile总数超过该值,会触发默认的合并操作 |
hbase.hstore.compaction.max | 一次最多合并多少个storefile |
hbase.hstore.blockingStoreFiles | 一个region中的Store(CoulmnFamily)内有超过xx个storefile时,则block所有的写请求进行compaction |
hfile.block.cache.size | regionserver的block cache的内存大小限制 |
hbase.hregion.memstore.flush.size | memstore超过该值将被flush |
hbase.hregion.memstore.block.multiplier | 如果memstore的内存大小超过flush.size * multiplier,会阻塞该memstore的写操作 |
6、HBase优化策略
1)、预先分区
创建HBase表的时候会自动创建一个Region 分区
创建HBase表的时候预先创建一些空的Regions
2)、RowKey优化
利用HBase默认排序特点,将一起访问的数据放到一起
防止热点问题,避免使用时序或者单调的递增递减等
3)、Column优化
列族的名称和列的描述命名尽量简短
同一张表中ColumnFamily的数量不要超过3个
4)、Schema优化
宽表:一种"列多行少"的设计
高表:一种"列少行多"的设计
7、HBase写优化策略
同步批量提交or异步批量提交
WAL优化,是否必须,持久化等级
8、HBase 读优化策略
客户端:Scan缓存设置,批量获取
服务端:BlockCache配置是否合理,HFile是否过多
表结构设计问题