分享

HBase避免写热点发生rowkey设计的疑惑

javaanddonet 发表于 2018-4-28 13:59:13
bioger_hit 发表于 2018-4-28 11:30
rowkey你自己可以分别的,比如下面:
a0120180428
b0220180428



但是如果对于使用hash散列的方式对表进行预分区的设置后,在我们进行put数据的时候,也需要将rowkey进行相同的散列逻辑进行转换吧,然后才能是数据均匀的分散在各个region中。

比如我的rowkey是01+20180428,经过散列转换之后,在hbase的真正表中,rowkey的应该不是0120180428这样存放的,应该是一个散列后转换的byte数组。所以我们在直接通过shell命令行查询的时候,得到的结果应该是一个如下的现象,图中的表是我根据论坛中散列分区的方式设置了预分区。然后我通过java api向表中进行put数据。其中的第一条在put的时候,rowkey指定为0001,我没有对rowkey进行对应的hash转换加盐的操作。所以他在表中仍然以0001存储。而第二条记录,我的rowkey是1,但是我经过了散列转换,将rowkey变成了一个byte数组。结果就是如下所示:

dt.jpg

上述的两条记录,第一条记录的put方式,仍然会有写热点的问题存在,对吧。
而第二条记录的put方式,因为经过了散列处理,所以数据会均匀的放在各个region上,没有写热点的问题。但是这样shell命令行中,我们在查询的时候,不容易看到这个rowkey的真正的值是多少。需要通过反转的操作,才能知道rowkey的值。

回复

使用道具 举报

nextuser 发表于 2018-4-28 22:33:36
javaanddonet 发表于 2018-4-28 13:59
但是如果对于使用hash散列的方式对表进行预分区的设置后,在我们进行put数据的时候,也需要将rowkey ...

出现这个是因为没有真正的实战过。
对于插入的rowkey是需要有规则的,而不是像楼主这样随意的插入。


对于第二行(列簇),出现了16进制,是因为插入的问题出现了乱码。对于16进制,有的最好使用转义字符,转义下。

回复

使用道具 举报

12
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条