美文网首页
HBase region拆分

HBase region拆分

作者: Moon_魔宽 | 来源:发表于2019-03-09 14:51 被阅读0次

    版权声明:本文为博主原创文章,未经博主允许不得转载。https://www.jianshu.com/u/c801d8028b0c

    【基本概念】

    HBase是以表的形式存储数据的。一张表被划分为多个regions,regions分布在多个Region Server上,单个region只能分布在一个Region Server节点上,不能跨Region Server存放。

    Region的两个重要属性:StartKey和EndKey,分别表示这个region所维护的rowkey范围。当做读/写请求时,寻址到该数据的rowkey落在某个start-end key范围内,那么就会定位到该范围内的region所在的Region Server上进行数据读/写。

    【问题引入】

    当表被创建时,HBase默认只会为该表分配一个region,那么,初始状态时所有的请求都会集中在一个Region Server上,当大量数据写入时,该节点将成为热点,甚至产生full gc。

    当然,region热点不仅体现在创建表阶段。对于一张拥有很多region的大表来说,其在Region Sever上的分布往往不会十分均匀,region较多的Region Server在有大量数据写入时,它的负载也会大于其他region数少的Region Server,这也是热点。

    因此,针对上述两种情况,该如何避免热点发生就是一个常见的话题。

    【解决办法】

    如果知道了HBase数据表的key分布情况,可以根据需要,规划要拆分成多少个region,每个region的起始key是多少,那么就可以在建表时对HBase进行region的预分区,这样就能避免热点,提高数据写入效率。

    合理设计rowkey能让各个region的并发请求平均分配,使IO效率达到最高。比如,key的前几位字符串都是从0001~0010的数字,这样就可以分成10个region,使用SPLISTS,如下:

    create't1','f1',{SPLITS=>['0001','0002','0003','0004','0005','0006','0007','0008','0009']}

    如果分区分区信息比较多,那么可以通过指定分区文件来做:

    create't1','f1',{SPLITS_FILE=>'region_split_info.txt'}

    region_split_info.txt文件内容如下,每行都是key取值范围的分割点。文件第一行为第一个region的endkey,每行依次类推,最后一行的0009为倒数第二个region的endkey,同时也是最后一个region的startkey。

    cat region_split_info.txt

    0001|

    0002|

    0003|

    0004|

    0005|

    0006|

    0007|

    0008|

    0009|

    在HBase Master Web UI页面上查看,可以看到第一个region是没有startkey,最后一个region是没有endkey的。

    HBase Master Web UI

    【案例分析】

    某业务系统通过调用HBase API向HBASE集群写入数据,根据业务需求,对一个含有大量子项的指标项Core进行了拆分,重新写入HBase。因为拆分后的Core属于新增字段,产生了新的row key,这些数据的row key会集中在同一个region的Region Server上,该Region Server节点由于吞吐量过大而发生gc。为避免热点的发生,让新插入的指标项Core.XX打散写入到不同region的Region Server上,需要手工对指标项的row key进行分区。

    步骤如下:

    1、查看表行,获取row key

    echo"scan 'tsdb-uid'" | hbase shell | grep -i core | grep metrics

    \x00\x00\xB5column=name:metrics, timestamp=1527594451691, value=CORE.CPUIdleTime

    \x00\x00\xB6column=name:metrics, timestamp=1527594451691, value=CORE.CPUIdleTime

    \x00\x00\xB7column=name:metrics, timestamp=1527594451696, value=CORE.CPUWio

    \x00\x00\xB8column=name:metrics, timestamp=1527594451696, value=CORE.CPUWio

    \x00\x00\xB9column=name:metrics, timestamp=1527594451699, value=CORE.CPUSysTime

    \x00\x00\xBAcolumn=name:metrics, timestamp=1527594451700, value=CORE.CPUSysTime

    \x00\x00\xBBcolumn=name:metrics, timestamp=1527594451703, value=CORE.CPUUserTime

    \x00\x00\xBCcolumn=name:metrics, timestamp=1527594451703, value=CORE.CPUUserTime

    \x00\x00\xBDcolumn=name:metrics, timestamp=1527594451706, value=CORE.CPUCpuUtil

    可以看到,有四个子指标项CPUIdle、CPUWio、CPUTIME、CPUCpu可做进一步拆分

    2、对row key进行分区

    split'tsdb'.to_java_bytes,"\x00\x00\xB5".to_java_bytes

    split'tsdb'.to_java_bytes,"\x00\x00\xB7".to_java_bytes

    split'tsdb'.to_java_bytes,"\x00\x00\xB9".to_java_bytes

    split'tsdb'.to_java_bytes,"\x00\x00\xBB".to_java_bytes

    相关文章

      网友评论

          本文标题:HBase region拆分

          本文链接:https://www.haomeiwen.com/subject/omispqtx.html