分享

读《Hbase权威指南》的一个疑问

pengsuyun 发表于 2015-1-7 12:54:22 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 12 25238
在《Hbase权威指南》有这么一段话:“在读取所有存储文件来查找匹配的条目之前,需要有一个快速的排除查找阶段:使用时间戳以及可选的布隆过滤器来调过那些绝对不包含所需KeyValue的文件。”

使用布隆过滤器过滤绝对不包含所需KeyValue的文件,这个我可以理解。

问题来了,时间戳怎么过滤文件呢?

我所知道的,在通过hbaseAPI(scan和get)查询表数据的时候,可以调用setTimeStamp方法来指定时间戳,而且存储在文件中的KeyValue也是有时间戳的,但是这两个应该是不能拿来比对筛选文件的。

下面是个人的一些猜想,不知道对不对,有问题请大神们指出来。
我想应该StoreFile会有一个类似时间戳的属性,作为StoreFile的文件信息,用来存储这个StoreFile最后一次更新时间(类似这样的一个属性),然后这样就可以根据查询设定的时间戳和这个属性的值比对,达到过滤文件的目的。

已有(12)人评论

跳转到指定楼层
pengsuyun 发表于 2015-1-7 13:04:40
查了下hbase的API,在StoreFileInfo类中,提供了方法getModificationTime,用于查询Hfile最后一次修改的时间,难道这就是答案了?
回复

使用道具 举报

desehawk 发表于 2015-1-7 15:04:57
storefile里面时间是降序排列的,所以可以按照时间来查询,关键明白是排序,相信这个问题就解决了。
更多内容:
storefile的内部有三维有序的,但是各个storefile之间并不是有序的。比如,storefile1中可能有rowkey为100到110的记录,而storefile2可能有rowkey为105到115的数据,storefile的rowkey的范围很有可能有交叉。所以查询数据的过程也不可能是对storefile的顺序查找。
hbase会首先查看每个storefile的最小的rowkey,然后按照从小到大的顺序进行排序,结果放到一个队列中,排序的算法就是按照hbase的三维顺序,按照rowkey,column,ts进行排序,rowkey和column是升序,而ts是降序。
实际上并不是所有满足时间戳和列过滤的文件都会加到这个队列中,hbase会首先对各个storefile中的数据进行探测,只会扫描扫描那些存在比当前查询的rowkey大的记录的storefile。举例来说,我当前要查找的rowkey为108,storefile1中rowkey范围为100~104,storefile2中rowkey的范围为105~110,那么对于storefile1最大的rowkey为104,小于105,所以不存在比所查rowkey105大的记录,storefile并不会被加到该队列中。根据相同的规则,storefile2则会被添加到该队列中。


来源链接

hbase的read读取查询数据操作的认识

回复

使用道具 举报

pengsuyun 发表于 2015-1-7 15:25:49
desehawk 发表于 2015-1-7 15:04
storefile里面时间是降序排列的,所以可以按照时间来查询,关键明白是排序,相信这个问题就解决了。
更多 ...

不是一回事吧?
回复

使用道具 举报

desehawk 发表于 2015-1-7 15:43:52
可以列出一些数据,共同探讨。
回复

使用道具 举报

pengsuyun 发表于 2015-1-7 15:51:48
desehawk 发表于 2015-1-7 15:04
storefile里面时间是降序排列的,所以可以按照时间来查询,关键明白是排序,相信这个问题就解决了。
更多 ...

你这里讲的内容,我应该是赞同的。
但是我要问的问题应该跟这个没多大关系。

我想问的是,hbase怎么基于时间戳去过滤存储文件(HFile)
要是我没弄错的话,应该是根据HFile文件的最后修改时间来过滤的。
举个例子
我现在要查ts=4321 的行数据,
hbase下面的有文件A和文件B,同时这两个文件的最后修改时间分别是:
文件A : 3000
文件B: 5000

这样的话,文件A肯定就会被过滤掉了,Hbase只会在文件B中去查找数据。
回复

使用道具 举报

desehawk 发表于 2015-1-7 16:26:54
pengsuyun 发表于 2015-1-7 15:51
你这里讲的内容,我应该是赞同的。
但是我要问的问题应该跟这个没多大关系。
HFile文件的最后修改时间,这个网上没有找到这方面的资料,你是说HFile会记录这个时间?
回复

使用道具 举报

pengsuyun 发表于 2015-1-7 16:30:27
desehawk 发表于 2015-1-7 16:26
HFile文件的最后修改时间,这个网上没有找到这方面的资料,你是说HFile会记录这个时间?

应该是hdfs记录了这个修改时间,然后StoreFile做了简单的封装,提供出来。你看下我2楼提到的API。
回复

使用道具 举报

desehawk 发表于 2015-1-7 16:48:37
pengsuyun 发表于 2015-1-7 16:30
应该是hdfs记录了这个修改时间,然后StoreFile做了简单的封装,提供出来。你看下我2楼提到的API。
如果这样的话,它只能单个排除store file。
关于这个类,也找到相关信息,确实可以获取修改文件的时间,但是个人觉得这个可能是store file的合并或则分裂时间
回复

使用道具 举报

pengsuyun 发表于 2015-1-7 16:55:28
desehawk 发表于 2015-1-7 16:48
如果这样的话,它只能单个排除store file。
关于这个类,也找到相关信息,确实可以获取修改文件的时间, ...

排除几个,应该就没什么限制了。
至于这个时间表示是合并时间或者分裂时间,对于过滤HFile应该是没有影响的,一样的可以拿来过滤文件。你想想是这样吗?
回复

使用道具 举报

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

本版积分规则

关闭

推荐上一条 /2 下一条