RowKey设计的好是可以提升集群的性能的,如果设计不好的话,那么集群的HBase集群的性能不好.
HBase是Key Value存储的,Key就是RowKey,数据在存到HBase之前会先计算RowKey在Region列表的中的起始范围. 比如说RowKey为1000的话,就会存到StartKey和EndKey在这个范围内的那个Region里面<br />
RowKey设计原则
1.防止数据过于集中
一条数据的唯一标识就是rowkey,那么这条数据存储于哪个分区,取决于rowkey处于哪个一个预分区的区间内,设计rowkey的主要目的 ,就是让数据均匀的分布于所有的region中,在一定程度上防止数据倾斜。
如果数据量很大的话,那么RowKey一定要设计足够离散,这样可以让数据均匀的分布到HBase的多个分区里面,防止数据过于集中.
2.唯一性
不用讲了,RowKey就相当于数据库的主键.
3.长度原则
如果你要保证唯一性的话,那么必须要保证RowKey足够长才行,因为HBase的数据量很大的.]
RowKey长度一般是70~100
常见的设计方案
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前部!