HBase rowkey设计与热点解决方案
一、Rowkey设计原则
Rowkey是按照字典顺序排序的,先比较第一个字节,如果相同,然后比对第二个字节,以此类推;
1)长度原则:是一个二进制字节流,可以是任意字符串,最大长度64kb,实际应用中一般为10-100bytes,以byte[]形式保存,一般设计为定长;建议不超过16个字节,设计过长会降低memstore内存的利用率;
2)散列原则:一般将高位作为散列字段,这样将提高数据均衡分布在每一个RegionServer,达到负载均衡的目的;
3)唯一原则:保证其唯一性
二、热点解决方案
热域:查询数据是通过rowkey来定位数据行的,当大量的client访问hbase集群的一个或少数几个节点时,造成少数的regionserver的读写请求过多,负载过大,而其他的regionserv负载很小,就会导致热域问题;
解决方案:
1)预分区:让表中的数据均衡的分散在集群中,一般默认建表时只有一个region分布在集群中某个regionserver上;
2)加盐:在rowkey的高位增加随机数
3)哈希
4)反转:反转固定格式或者数字的rowkey,类似手机号;
三、HBase表的预分区
1)预分区:当一个表刚创建时,HBase默认分配一个Region给table,这是所有的读写请求都会访问到同一个RegionServer的同一个Region上,这是不能做到负载均衡;预分区可以增加数据的读写效率,负载均衡,防止数据倾斜,每一个Region都维护着startRow和endRow,如果加入的数据符合某个Region维护的rowkey,将数据写入该Region
# 手动创建指定预分区
create 't_user_info', 'data', 'meta', SPLIT => ['100', '200', '300']