* 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
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

HBase框架基础(五)的更多相关文章

  1. HBase框架基础(四)

    * HBase框架基础(四) 上一节我们介绍了如何使用HBase搞一些MapReduce小程序,其主要作用呢是可以做一些数据清洗和分析或者导入数据的工作,这一节我们来介绍如何使用HBase与其他框架进 ...

  2. HBase框架基础(三)

    * HBase框架基础(三) 本节我们继续讨论HBase的一些开发常识,以及HBase与其他框架协调使用的方式.在开始之前,为了框架之间更好的适配,以及复习之前HBase的配置操作,请使用cdh版本的 ...

  3. HBase框架基础(一)

    * HBase框架基础(一) 官方网址:http://hbase.apache.org/ * HBase是什么妖怪? 要解释HBase,我们就先说一说经常接触到的RDBMS,即关系型数据库: ** m ...

  4. HBase框架基础(二)

    * HBase框架基础(二) 上一节我们了解了HBase的架构原理和模块组成,这一节我们先来聊一聊HBase的读写数据的过程. * HBase的读写流程及3个机制 HBase的读数据流程: 1.HRe ...

  5. 爬虫基础(五)-----scrapy框架简介

    ---------------------------------------------------摆脱穷人思维 <五> :拓展自己的视野,适当做一些眼前''无用''的事情,防止进入只关 ...

  6. Hadoop框架基础(五)

    ** Hadoop框架基础(五) 已经部署了Hadoop的完全分布式集群,我们知道NameNode节点的正常运行对于整个HDFS系统来说非常重要,如果NameNode宕掉了,那么整个HDFS就要整段垮 ...

  7. HBase零基础高阶应用实战(CDH5、二级索引、实践、DBA)

    HBase是一个分布式的.面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”.就像Bigtable利用了Google文件 ...

  8. 框架基础之Hibernate简介

    框架基础之Hibernate简介 1.什么是Hibernate? Hibernate是一个开发源代码的对象关系映射框架,它对JDBC进行非常轻量级的对象封装,使得程序员可以随心所欲地使用对象编程思维来 ...

  9. [Hbase]Hbase章1 Hbase框架及基本概念

    Hbase框架介绍 HBase是一个分布式的.面向列的开源数据库. 不同点: l  和一般的关系数据库不同,hbase是一个适合于非结构化数据存储的数据库. l  Hbase是基于列而不是基于行的模式 ...

随机推荐

  1. Coding上部署Ghost博客

    Ghost构建于Node.js平台之上.支持0.10.*版本号的Node.js. 在你的本地计算机上执行Ghost事实上非常easy,前提是你已经安装了Node.js. 什么是Node.js? 略过 ...

  2. node.js mongodb ReplSet

    随着web2.0兴起,高并发大数据量的应用对数据库高速响应的性能要求日趋明显,传统的关系型数据库在这方面显得有些乏力.有矛自有盾,内存DB的出现弥补了传统关系型db的不足.眼下市面流行的内存db主要有 ...

  3. python爬虫 分页获取图片并下载

    --刚接触python2天,想高速上手,就写了个爬虫,写完之后,成就感暴增,用起来顺手多了. 1.源代码 #coding=utf-8 import urllib import re class Pag ...

  4. HDU 5228 ZCC loves straight flush( BestCoder Round #41)

    题目链接:pid=5228">ZCC loves straight flush pid=5228">题面: pid=5228"> ZCC loves s ...

  5. Re:从0开始的微服务架构:(一)重识微服务架构--转

    原文地址:http://www.infoq.com/cn/articles/micro-service-architecture-from-zero?utm_source=infoq&utm_ ...

  6. Linux Screen命令使程序远离断网影响

    linux中强大的screen命令2008-12-02 21:53今天发现了一个“宝贝”,就是Linux的screen命令,对于远程登录来说,不仅提供了类似于nohup的功能,而且提供了我非常喜欢的“ ...

  7. 【原创】Spring连接、事务代码分析

    1.JdbcTemplate     当不使用事务时,jdbcTemplate的模板类,通过     Connection con = DataSourceUtils.getConnection(ge ...

  8. [BeiJing2006]狼抓兔子 dijkstra+平面图最小割

    一眼裸的最大流求最小割,然而数据范围过大,跑不下来. 我们可以将平面图转成对偶图,并进行连边. 这样,每条边的长度就对应原图中的割边长度. 起点到终点的最短路即为最小割. 别用SPFA,会死的很惨 C ...

  9. SP1487 PT07J - Query on a tree III 主席树+dfs序

    Code: #include<iostream> #include<cstdio> #include<algorithm> #include<string&g ...

  10. ORACLE查询优化之is null和is not null优化

    最近工作的时候遇到了比较大的数据查询,自己的sql在数据量小的时候没问题,在数据量达到300W的时候特别慢,只有自己优化sql了,以前没有优化过,所以记录下来自己的优化过程,本次是关于is null和 ...