hbase如何判断数据写入哪一个region

HBase中,表会被划分为1...n个Region,被托管在RegionServer中。Region二个重要的属性:StartKey与EndKey表示这个Region维护的rowKey范围,当咱们要读/写数据时,若是rowKey落在某个start-end key范围内,那么就会定位到目标region而且读/写到相关的数据。简单地说,有那么一点点相似人群划分,1-15岁为小朋友,16-39岁为年轻人,40-64为中年人,65岁以上为老年人。(这些数值都是拍脑壳出来的,只是举例,非真实),而后某人找队伍,而后根据年龄,处于哪一个范围,就找到它所属的队伍。
    而后,默认地,当咱们只是经过HBaseAdmin指定TableDescriptor来建立一张表时,只有一个region,正处于混沌时期,start-end key无边界,可谓海纳百川。啥样的rowKey均可以接受,都往这个region里装,然而,当数据愈来愈多,region的size愈来愈大时,大到必定的阀值,hbase认为再往这个region里塞数据已经不合适了,就会找到一个midKey将region一分为二,成为2个region,这个过程称为分裂(region-split).而midKey则为这二个region的临界。性能

    如何找到midKey?涉及的内容比较多,暂且不去讨论,最简单的能够认为是region的总行数 / 2 的那一行数据的rowKey.虽然实际上比它会稍复杂点。
    若是咱们就这样默认地,建表,表里不断地Put数据,更严重的是咱们的rowkey仍是顺序增大的,是比较可怕的。存在的缺点比较明显。
    首先是热点写,咱们老是会往最大的start-key所在的region写东西,由于咱们的rowkey老是会比以前的大,而且hbase的是按升序方式排序的。因此写操做老是被定位到那个region中。
    其次,因为写热点,咱们老是往最大start-key的region写记录,以前分裂出来的region不会再被写数据,有点被打进冷宫的赶脚,它们都处于半满状态,这样的分布也是不利的。
    若是在写比较频率的场景下,数据增加快,split的次数也会增多,因为split是比较耗时耗资源的,因此咱们并不但愿这种事情常常发生。server

    看到这些缺点,咱们知道,在集群的环境中,为了获得更好的并行性,咱们但愿有好的load blance,让每一个节点提供的请求处理都是均等的。咱们也但愿,region不要常常split,由于split会使server有一段时间的停顿,如何能作到呢?
随机散列与预分区。两者结合起来,是比较完美的,预分区一开始就预建好了一部分region,这些region都维护着自已的start-end keys,再配合上随机散列,写数据能均等地命中这些预建的region,就能解决上面的那些缺点,大大地提升了性能。排序

   有时候根据本身的业务场景咱们可能只须要将rowkey随机散列,所随机出的rowkey有可能会小于第二个region的startkey并大于第一个region的startkey,这时候就与第一个region通讯,以此类推。虽然rowkey随机化处理,不是将整个递增的rowkey数据均云分布到全部的region,可是能够保证大体的分布ip

相关文章
相关标签/搜索