分享

RowKey的设计成 散列 和 有序 不矛盾吗?

daohaoisbibi 发表于 2017-1-24 10:08:45 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 6 14702
场景:
我有一批文件名 有序  需要存入hbase
我希望能避开热点问题  将这些文件均匀存到多个region
我又希望能检索的时候检索出已排序的一批文件
这样不冲突吗? 如何设计呢

已有(6)人评论

跳转到指定楼层
easthome001 发表于 2017-1-24 11:31:30
楼主说的对的,二者确实是矛盾的。但是也有一些解决办法。比如rowkey中有用户id,时间戳。

需要保存一个用户的操作记录,按照操作时间倒序排序,在设计rowkey的时候,可以这样设计
[userId反转][Long.Max_Value - timestamp],在查询用户的所有操作记录数据的时候,直接指定反转后的userId,startRow是[userId反转][000000000000],stopRow是[userId反转][Long.Max_Value - timestamp]
如果需要查询某段时间的操作记录,startRow是[user反转][Long.Max_Value - 起始时间],stopRow是[userId反转][Long.Max_Value - 结束时间]这样时间应该是有序的



回复

使用道具 举报

daohaoisbibi 发表于 2017-1-24 11:45:59
easthome001 发表于 2017-1-24 11:31
楼主说的对的,二者确实是矛盾的。但是也有一些解决办法。rowkey中有用户id,时间戳。

您好。
按userid 反序 散列后。属于该userid的依然会存在同一个region下啊(假设不会split)。所以还是会有热点问题。
而 hash,salt确实可以随机,但是读取的时候会有问题,你无法确定前缀去get。而用hash后,文件顺序就会发生改变。
目前业务需求是:
1.实现bucket,每个bucket下很多文件,文件顺序很重要
2.避免热点,高效读写
3.分页查询

我目前的结果:
salt+bucket+time+file
1. 根据预划分的region确定salt
2.数据录入的时候 根据录入前顺序 分配有序的salt

但是get和scan有点问题。因为前缀无法确定。
前缀无法确定的你们一般是怎么读取的啊????很多都讲 散列,散列。散列之后如何高效读取呢?
回复

使用道具 举报

easthome001 发表于 2017-1-24 12:41:58
daohaoisbibi 发表于 2017-1-24 11:45
您好。
按userid 反序 散列后。属于该userid的依然会存在同一个region下啊(假设不会split)。所以还是 ...

前缀不确定的话,可以尝试间接后缀
下面是间接实现的
Filter filter2 = new RowFilter(CompareFilter.CompareOp.EQUAL, // co RowFilterExample-2-Filter2 Another filter, this time using a regular expression to match the row keys.
             new RegexStringComparator(".*_2015100112"));
           scan.setFilter(filter2);
           ResultScanner scanner2 = table.getScanner(scan);
           // ^^ RowFilterExample
           System.out.println("Scanning table #2...");
           // vv RowFilterExample
           for (Result res : scanner2) {
             System.out.println(res);
           }
还有
userid应该是唯一的吧,这个应该不会很多吧
回复

使用道具 举报

daohaoisbibi 发表于 2017-1-24 13:07:14
easthome001 发表于 2017-1-24 12:41
前缀不确定的话,可以尝试间接后缀
下面是间接实现的
还有

userid应该是没多少的。  但是我这边bucket却可能有很多个。后缀匹配查询效率怎么样啊,感觉后缀匹配是扫全表啊。。。不会杯具吗?
回复

使用道具 举报

easthome001 发表于 2017-1-24 13:26:22
daohaoisbibi 发表于 2017-1-24 13:07
userid应该是没多少的。  但是我这边bucket却可能有很多个。后缀匹配查询效率怎么样啊,感觉后缀匹配是扫 ...

bucket是指什么?我看你里面没有userid,你可以在bucket上想想,它能否颠倒
回复

使用道具 举报

daohaoisbibi 发表于 2017-1-24 13:57:48
easthome001 发表于 2017-1-24 13:26
bucket是指什么?我看你里面没有userid,你可以在bucket上想想,它能否颠倒

好的。 多谢。 方案基本定了。。。   刚接触。不太熟,谢谢指教!祝新年快乐
回复

使用道具 举报

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

本版积分规则

关闭

推荐上一条 /2 下一条