• HBase框架基础(五)


    * HBase框架基础(五)

    本节主要介绍HBase中关于分区的一些知识。

    * HBase的RowKey设计

    我们为什么要讨论rowKey的设计?或者说为什么很多工作岗位要求有rowKey的优化设计经验?这个我们需要简单的谈一谈HBase的存储情景。

     
     

    简单讨论:

    ** 一个Table表可以划分为多个Region

    ** 每个Regin维护着不同的范围的rowKey,如何维护呢?Region提供了StartKey和EndKey来表示某一个范围内的rowKey,比如,我们有3个Region,维护的rowKey范围是:

     
     

    假设,当新插入一条数据的rowKey是15时,该条数据就会自动的进入Region2进行保存,以为15这个rowKey符合11~20这个维护范围。

    好,明白了这个原理后,问题来了。在之前我们从来没有做过什么StartKey、EndKey啊,那么在这样的情况下,所有的rowKey就会被混在一起存储,但是Region越来越大怎么办呢,不是会分割么,混在一切怎么分割呢?接下来我们对每一个可能的疑问进行简单说明;

    Question:如何分割?

    Answer:一刀从中间劈开,从而将一个Region变成了两个Region。

    Question:它怎么知道哪里是中间?

    Answer:HBase会将存储的RowKey进行升序排序,所以它知道哪里是中间(注意这个排序不只是数字,字符串等等也是可以的)。

    Question:那我默认用的挺爽啊,没啥问题啊,设计范围干嘛玩意?

    Answer:好,假设你现在存了很多数据,rowKey在不停地增大,大到一定程度,劈开!然后又有新的数据进来,会put到劈开后的Region里,然后再劈开,你懂得,最后就会导致每次越往后Region的分区越臃肿,而前边的Region就会比较静止,明显出现负载分配不均的情况。

    设计方式:

    其实设计这个东西主要是能够让数据平均分配到所有的Region中,那这就意味着应该让rowKey的StartKey和EndKey分布的尽可能随机。

    1、生成随机数、Hash、散列值

    比如:

    原本rowKey为1001的,MD5后变成:b8c37e33defde51cf91e1e03e51657da

    原本rowKey为3001的,MD5后变成:908c9a564a86426585b29f5335b619bc

    原本rowKey为5001的,MD5后变成:03b264c595403666634ac75d828439bc

    在做此操作之前,一般我们会选择从数据集中抽取样本,来决定什么样的rowKey来Hash后作为每个分区的临界值。

    2、字符串反转

    比如:

    20170524000001转成10000042507102

    20170524000002转成20000042507102

    这样也可以在一定程度上散列逐步put进来的数据。

    3、字符串拼接

    比如:

    20170524000001_a12e

    20170524000001_93i7

    等等

    * HBase的预分区

    在想好怎么设计rowKey后,就可以开始预分区了。

    方式一:

    hbase> create 'table1','partition1',SPLITS => ['1000', '2000', '3000', '4000']

    创建后,来到网页段查看:

     
    留意红蓝框内容,出现了5个分区

    再点进去看一下:

     
    还没有插入数据,已经出现了5个预分区,分布在不同的集群节点上

    方式二:

    hbase> create 'table2','partition2',SPLITS_FILE => 'splits.txt'

    splits.txt文件中对应的内容比如:

    aaaa

    bbbb

    cccc

    dddd

    成功后,如图:

     
    注意观察一下分区的分布情况

    方式三:

    hbase> create 'table3', 'partition3', {NUMREGIONS => 15, SPLITALGO => 'HexStringSplit'} 

    这种方式生成了一个16进制的字符串来作为分区字段,如图:

     
     

    方式四:

    Java API

     

     
     

    * 总结

    我们仔细研究rowKey的预分区,主要是为了避免出现热点话题这样的现象,以此来提高集群存储性能,后面我将根据一些项目来进一步说明此设计理念。


    个人微博:http://weibo.com/seal13

    QQ大数据技术交流群(广告勿入):476966007



    作者:Z尽际
    链接:https://www.jianshu.com/p/1613df3a3436
    來源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 相关阅读:
    【Struts 动态表单】DynaActionForm
    【Struts 分派Action】DispatchAction
    【struts 报错】 No action config found for the specified url
    【Struts APP_PATH】StartSystemListener
    【Struts 编码】
    【Struts 基础案例】
    28. 实现 strStr()
    14. 最长公共前缀
    2. 两数相加
    15. 三数之和
  • 原文地址:https://www.cnblogs.com/wzlbigdata/p/8277734.html
Copyright © 2020-2023  润新知