天天看点

HBase的 RowKey的设计

RowKey设计的好是可以提升集群的性能的,如果设计不好的话,那么集群的HBase集群的性能不好.      

HBase是Key Value存储的,Key就是RowKey,数据在存到HBase之前会先计算RowKey在Region列表的中的起始范围. 比如说RowKey为1000的话,就会存到StartKey和EndKey在这个范围内的那个Region里面

一条数据的唯一标识就是rowkey,那么这条数据存储于哪个分区,取决于rowkey处于哪个一个预分区的区间内,设计rowkey的主要目的 ,就是让数据均匀的分布于所有的region中,在一定程度上防止数据倾斜。

如果数据量很大的话,那么RowKey一定要设计足够离散,就是数据一定要分散开来(不要过于集中).

常见的设计方案

1.生成随机数、hash、散列值

原本rowKey为1001的,SHA1后变成:dd01903921ea24941c26a48f2cec24e0bb0e8cc7原本rowKey为3001的,SHA1后变成:49042c54de64a1e9bf0b33e00245660ef92dc7bd原本rowKey为5001的,SHA1后变成:7b61dec07e02c188790670af43e717f0f46e8913在做此操作之前,一般我们会选择从数据集中抽取样本,来决定什么样的rowKey来Hash后作为每个分区的临界值。

2.字符串反转

20170524000001转成10000042507102

20170524000002转成20000042507102

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

3.字符串拼接

20170524000001_a12e20170524000001_93i7

原则:

①rowkey作为数据的唯一主键,需要紧密和业务相关,从业务中选择某个代表性的字段作为rowkey

②保证rowkey字段选取时的唯一性,不重复性

③rowkey足够散列,负载均衡

④让有业务关联的rowkey尽量分布到一个region中

例如: 转账的场景

流水号 转入账户 转出账户 时间 金额 用户

流水号适合作为rowkey,将流水号再拼接字符串,生成完整的rowkey!

格式: 流水号+时间戳 时间戳+流水号

流水号+随机数 随机数+流水号

如果流水号在设计时,足够散列,可以使用流水号在前,拼接随机数!

如果流水号不够散列,可以使用函数计算其散列值,或拼接一个散列的值!

举例:如何让一个月的数据,分布到同一个Region!可以取月份的时间,作为计算的参数,

使用hash运算,运算后的字符串,拼接到rowkey前部!

RowKey设计问题:

你往表里面插入数据的时候,实际上每一行都有一个RowKey,RowKey就类似于主键id.