实际问题:读写请求集中到某一个RegionServer上该如何处理?
1.数据倾斜的产生
Hbase可以被划分为多个region,但是默认创建时只有一个region分布在集群上的一个节点上,数据一开始都集中该region上,即集中在此节点上,当region存储达到阈值被划分时,数据也会存在少数几个节点,产生数据倾斜问题。
2. 解决数据倾斜的策略
(1)预分区
预分区,让表的数据可以均衡分散在各个节点上,而不是默认只有一个region,即分布在一个节点上。(预分区个数=节点的倍数);
(2)rowkey的散列设计
如果rowkey按照时间戳的方式递增,不要将时间放在二进制码的前面,建议将rowkey的高位作为散列字段,由程序随机生成,低位放时间字段,这样将提高数据均衡分布在每个RegionServer,以实现负载均衡的几率。 如果没有散列字段,首字段直接是时间信息,所有的数据都会集中在一个RegionServer 上,这样在数据检索的时候负载会集中在个别的RegionServer上,造成热点问题,会降低查询效率。
- 加盐 在 rowkey 的前面增加随机数,具体就是给rowkey分配一个随机前缀以使得它和之前的rowkey的开头不同。分配的前缀种类数量应该和你想使用数据分散到不同的region的数量一致。加盐之后的rowkey就会根据随机生成的前缀分散到各个region上,避免热点。
- 哈希 哈希会使同一行永远用一个前缀加盐。哈希也可以使负载分散到整个集群,但是读却是可以预测的。使用确定的哈希可以让客户端重构完整的rowkey,可以使 用 get 操作准确获取某一个行数据。
- 反转 反转固定长度或者数字格式的rowkey。这样可以使得 rowkey中经常改变的部分(最没有意义的部分)放在前面。这样可以有效的随机 rowkey,但是牺牲了rowkey 的有序性。