zoukankan      html  css  js  c++  java
  • 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
    來源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 相关阅读:
    leetcode5 Longest Palindromic Substring
    leetcode17 Letter Combinations of a Phone Number
    leetcode13 Roman to Integer
    leetcode14 Longest Common Prefix
    leetcode20 Valid Parentheses
    leetcode392 Is Subsequence
    leetcode121 Best Time to Buy and Sell Stock
    leetcode198 House Robber
    leetcode746 Min Cost Climbing Stairs
    tomcat下使用druid配置jnid数据源
  • 原文地址:https://www.cnblogs.com/wzlbigdata/p/8277734.html
Copyright © 2011-2022 走看看