Hbase 热点问题?
当我们没有提前创建分区的时候,只有一个region,默认rowkey是递增的
往大的region写数据,无法发挥集群写的优点,那之前的region有的未达到饱和状态,
就浪费了。数据分布不均。
例如:
Keys:[2-4]一直往rs1写数据,没有向其他的rs写,就会出现热点问题
就出现了热点的问题
什么是热点
产生原因
1、没有提前创建分区,Hbase 创建表默认只有一个分区
2、Rowkey设计不合理
只有一个regionserver,然后所有的rowkey都往该region里面写数据。最后regionserver就会承受不了压力。
就会出现单点故障,热点问题。
解决方案
hbase 创建表时指定分区
Hbase预分区
Shell createTable并预分区
JavaAPI createTable并预分区–直接根据描述创建表
JavaAPI createTable并预分区–根据描述和region个数以及startkey,endkey自动分配
JavaAPI createTable并预分区–根据表的描述和自定义的分区设置创建表(同步)
JavaAPI createTable并预分区–根据表的描述和自定义的分区设置创建表(异步)
合理设计rowkey
Rowkey 长度原则
Rowkey 散列原则
注意:rowkey低位和高位
Rowkey唯一原则
Rowkey 按照字典排序,可以提高查询的效率。
同一个用户:将最近可能访问的数据放到一块,可以提高数据查询的效率
不同的用户:将数据放在不同的regionserver上,以至负载均衡。
Hbase常见避免热点问题的方法(*****)
加盐
一把rowkey前缀,决定了在哪一个分区。
降低热点问题,但是会造成读的时候,效率下降。
哈希
反转
举例:
前缀都是一样,可能都会往一个region里面写数据时,就会出现热点问题。
返回来,把号码倒过来,就会是不同的数字,解决了热点问题。
时间戳反转
HBASE总结
1、尽量减少行和列的大小
2、列簇尽可能越短越好,最好是一个字符
3、冗长的属性名虽然可读性好,但是更短的属性存储在HBase中会更好