HBase优化
1、垃圾回收优化
使用CMS垃圾回收机制
2、启用压缩
GZIP、Snappy、LZO,推荐Snappy
3、MemStore缓存配置
4、Region拆分和合并
预建分区,避免自动split,提高hbase响应速度
5、Region均衡
避免出现Region热点现象,按照table级别进行balance
6、尽量只用1-3个列族
定期建表,如每月中旬建立下一个月的表,表名中含有年月
RowKey设计
1、保证唯一性
2、长度越短越好(加快再内存缓存时进行检索的效率)
3、散列:(散列+时间戳 或者 MD5加密后取前六位)
- rowkey均匀分布在各个hbase节点上,用MD5(用户ID/手机号/QQ号)取前几位+ (用户ID/手机号/QQ号) +发生时间(毫秒)+随机数,把数据打散到各Region;
- 没有散列值,如时间字段作为Rowkey的起始,会导致热数据集中在一个RegionServer上;
- 同一次查询的数据存储在一起;
提前对表进行分区,防止Region Split
Region数量计算
确定按年/季/月建表,如果数据量特别大,不能只有1个表
确定HFile最大大小,例如10G
假设有1个列族,1个月的数据有5T
则需要5T/(10G * 1)=512个Region
预建分区可以多估一点,分裂时写入或查询数据很缓慢
预分区?
在创建Hbase表的时候默认一张表只有一个region,所有的put操作都会往这一个region中填充数据,这时所有的负裁都在同一台机器上,当这个一个region过大时就会进行split。如果在创建hbase的时候就进行预分区则会减少当数据量猛增时由于region split带来的资源消耗。
HBase表的预分区需要紧密结合业务场景来选择分区的key值,每个region都有一个 startKey和一个endKey来表示该region存储的rowkey范围。如果知道hbase数据表的key的分布情况,就可以在建表的时候对hbase进行region的预分区,这样做的好处是防止太量数据插入的热点问题,提高数据插入的效率。
创建预分区有两种方法
1:采用Hbase自带的RegionSplitter()工具,它会通过MDS法生成MDS校验和,以此作为region的开始键;
2:使用自定义分区算法进行预分区
列簇设计原则???
1:列簇不宜过多,1~3个。跨列簇查询效率低下。同一个列簇的数据放在一起的,因为flush和compact是以region为单位的。
2:列簇的名字不宜过长
3:将经常一起查询的列放在一个列簇中
备注:因为列簇没有元数据的描述,所以想获取列簇的完整列名,则需要处理所有的行
网友评论