HBase热点问题以及解决方案
2019-01-27
热点是指发生在大量的Client直接访问集群的一个或极少数个节点(访问可能是读,写或者其他操作)。 大量访问会使热点Region所在的单个机器超出自身承受能力,引起性能下降甚至Region不可用,这 也会影响同一个RegionServer上的其他Region,由于主机无法服务其他Region的请求。
1 产生原因
- Hbase 创建表默认只有一个分区
- Rowkey 设计不合理
2 解决方案
- Hbase 创建表时指定分区
- 合理设计Rowkey
3 Hbase 常见避免热点问题方法
3.1 加盐
在rowkey的前面增加随机数。具体就是给rowkey分配一个随机前缀以使得它和之前排序不同。分配的前缀种类数量应该和你想使数据分散到不同的region的数量一致。加盐之后的rowkey就会根据随机生成的前缀分散到各个region上,以避免热点。
因为分配是随机的,所以如果你想要以字典序取回数据,你需要做更多工作。加盐这种方式增加了写时的吞吐量,但是当读时有了额外代价。
3.2 哈希
除了加盐,你也可以使用哈希,哈希会使同一行永远用同一个前缀加盐。哈希也可以使负载分散到整个集群,但是读却是可以预测的。使用确定的哈希可以让客户端重构完成的 rowkey,使用Get 操作获取正常的获取某一行数据。
3.3 翻转key
第三种防止热点的方法是翻转固定长度或者数字格式的rowkey。这样可以使得rowkey中经常改变的部分(最没意义的部分)放在前面。这样可以有效的随机 rowkey,但是牺牲了 rowkey 的有序性。