文档章节

HBase RowKey散列和预分区

 大胖和二胖
发布于 2016/09/01 17:12
字数 871
阅读 2411
收藏 3

首先看一下RowKey设计的3条原则

1、散列原则,不要用类似于时间戳这样的数据直接作为RowKey,如果确实需要用时间戳,可以把它放在低位,高位用散列来占位。

2、长度原则,其实总结就一句话,rowkey只是一个唯一标识符,并没有更多的实际意义,所以不要搞得太长,但是,我想说但是,如果我的rowkey是有意义的,那么让他长一些是不是也可以呢?

3、唯一性原则,这一点没什么好说的,RowKey需要唯一确定一条数据,所以必须唯一。

后面2条原则没什么好说的,我们重点来看一下散列原则,为什么会有这样的建议。

在HBase当中,表会被划分为1...n个Region,被托管在RegionServer中。Region二个重要的属性:StartKey与EndKey表示这个 Region维护的rowKey范围,当我们要读/写数据时,如果rowKey落在某个start-end key范围内,那么就会定位到目标region并且读/写到相关的数据。

如果我们在建表的时候,不预先设定好分区,随着表内数据的增多,HBase会自动把表进行split,但是这样做有几点问题,第一,分区的原则,可能并不是我们想要的;第二,在表内数据相对较少的时候,无法充分展现分布式并发处理的优势;第三,split操作,其实是比较耗资源的,如果数据增长过快,可能会相对频繁的发生。

那么,预分区又是如何实现的,我们看下面这个语句:

create 'testtable', 'common', 'data', {SPLITS => ['1','2','3']}

建好之后,我们可以在HBase的web页面当中,看到表的分区的分布情况:

我们看到,我们用1,2,3三个数,把一个table划分为了4个region,这四个region分别是:

x<1,  1<=x<2,  2<=x<3,  3<=x

那么我们在insert的数据的时候,又该怎么做呢?看下面的scala代码:

val p = new Put(Bytes.toBytes(String.valueOf(random.nextInt(4)) + new Date().getTime))

这句话是为一条新的数据,生成一个RowKey,那么我们的key值由2部分组成,随机散列+时间戳,其中随机散列包括:【0,1,2,3】一共4个值,根据上面我们划分的region,这4个值,将会映射到4个不同的region当中。

好吧,刚才我们直接把一种比较好的解决方案告诉给大家了。

最初的时候,我可不是这么做的,当时我并不知道有预分区这回事,所以我仅仅是建了一个表,这种情况下,它只有一个分区。

create 'testtable', 'common', 'data'

然后我用下面的语句来生成RowKey。

val p = new Put(Bytes.toBytes(new Date().getTime))

这样会发生什么事情?程序执行之后,持续不断的往这个默认的region当中写入数据,事实上也就只有一个regionserver来为我们服务,数据量大了之后,table终于发生了分裂,2个region了,可是情况并没有任何好转,因为我们的RowKey是不断增大的,所以,按照HBase默认的分区原则,所有的新的数据,都被写到了startkey最大的那个region当中。分布式的性能优势完全无法体现。

 

© 著作权归作者所有

粉丝 23
博文 69
码字总数 50842
作品 0
沈阳
架构师
私信 提问
hbase的预region分区 脚本 经典

一、Region 概念 Region是表获取和分布的基本元素,由每个列族的一个Store组成。对象层级图如下: Table (HBase table) Region 大小 Region的大小是一个棘手的问题,需要考量如下几个因素。 ...

stys35
01/23
0
0
storm自定义分组与Hbase预分区结合节省内存消耗

Hbas预分区 在系统中向hbase中插入数据时,常常通过设置region的预分区来防止大数据量插入的热点问题,提高数据插入的效率,同时可以减少当数据猛增时由于Region split带来的资源消耗。大量的...

刘洋intsmaze
2017/03/31
0
0
Hive查询HBase调用MapReduce性能优化

折腾了很久,被领导天天督促&指点,算是有个最基本的性能优化。 1. 背景介绍: Hive使用hive-hbase-handler建立HBase external table。在hive查询包含count(*)、join、以及Predicate Pushdow...

orisonchan
2018/08/09
0
0
Spark + Hbase 自定义读取分片数据

大猪 见很多文章都写了如何设计避免热点问题,就连 大猪 的文章也写过这样的优化,但是只说到了优化的点上,那如何方便读取呢?刚才就有一位老朋友跟我说他的方案,他是做了16个预分区,然后...

大猪佩琪2019
03/24
0
0
Spark+Hbase 读取分片数据、深挖原理

大猪 见很多文章都写了如何设计避免热点问题,就连 大猪 的文章也写过这样的优化,但是只说到了优化的点上,那如何读取呢?刚才就有一位老朋友跟我说他的方案,他是做了16个预分区,然后就把...

大猪大猪
05/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

蚂蚁区块链BaaS:开放在云端,落地于实体

自 2018 年 6 月上线以来,蚂蚁区块链 BaaS 不断在技术上实现突破,形成自身独特的优势,并做为行业领军者在不同领域的几十个场景实现落地。在区块链的商用时代加速到来之际,通过开放自身的...

阿里云官方博客
26分钟前
3
0
Idea cannot access【好使】

Idea中无法访问类中public方法。。 解决: idea点击左下角电脑图标,打开右边栏各种功能键 右边栏Maven Projects中点一下刷新,就是那个两个蓝的箭头组成的环 ----------------------------...

Airship
27分钟前
3
0
Spark内置图像数据源初探

作者:林武康,花名知瑕, 阿里巴巴计算平台事业部EMR团队的高级开发工程师,Apache HUE Contributor, 参与了多个开源项目的研发工作,对于分布式系统设计应用有较丰富的经验,目前主要专注于...

阿里云云栖社区
27分钟前
1
0
【面试被虐】游戏中的敏感词过滤是如何实现的?

小秋今天去面试了,面试官问了一个与敏感词过滤算法相关的问题,然而小秋对敏感词过滤算法一点也没听说过。于是,有了以下事情的发生….. 面试官开怼 面试官:玩过王者荣耀吧?了解过敏感词过...

爱编程的浪子
30分钟前
4
0
springboot之maven属性引入

<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-resources-plugin</artifactId><version>2.7</version><configuration><delimiters><delimite......

Online_Reus
31分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部