您的位置:首页 > 其它

关于hbase中scan的一些总结

2017-11-02 10:58 856 查看
首先,对于scan来说,哪些会全表扫描,哪些不会全表扫描。对于这点,笔者原来有些疑惑,以为只要是对于scan来说,都会全表扫描。最近阅读了一些源码以及和咨询一些大神,稍微总结了下。                什么是scan,scan是较为底层的也是用的最多的一种获取Hbase中数据的方式,在它的上面还封装了几种基于scan的获取方式的数据,例如snapshotScanMR,TableScanMR,scanMR。这几中方式都是基于scan,用MR的方式去获取数据,并且对于获取大批量的数据来说,效率都比scan好的多。下文再细说。         回到最开始的问题。scan可以根据rowkey,cf,column,timestamp,filter来获取方式。在这里优先推荐根据rowkey的方式获取数据,即可以指定startrow和endrow,也可以指定具体的某个行键去获取数据。在源码中也指出了如果具体指定了rowkey,那么会只是扫描那一段的数据。众所周知,hbase底层存储数据是根据rowkey的字典顺序存储数据的,所以如果使用rowkey的方式去查找,scan就可以顺序查找,大大缩短了时间。
Rather than specifying a single row, an optional startRow
* and stopRow may be defined.  If rows are not specified, the Scanner will
* iterate over all rows.
第二种就是根据timestamp去查找,对于这个时间戳,特别注意的是指的是存入hbase中的时间,在存入时,对应的cell中会记录下来。而不是客户端插入的数据的时间,这里肯定会有一定的使时间偏移,但相差不会很大。对于timestamp的方式来说,它也是只是去扫描对应范围或者对应某个时间戳去获取。            其他的方式,就是通过全表扫描去查询的。这里就一一说了。            在用scan查询的时候,有个next()方法,一次默认返回100条数据(或者不超过2m的数据),这不同scan中
setBatch()方法,这里返回的是给hbase服务器的值而不是返回给客户端的值,怎么做是为了避免在全表扫描的时候
一次返回太多数据,导致OOM。
我们知道,对于scan来说,他不是并行执行的。它会先去cacheblock去找对于的数据块。如果没有数据,再去
hfile和memstore。时间一般情况下都会损失在检索在hfile中。
对于snapshotScanMR和TableScanMR来说,他通过MR,一个region对应一个mapper,也就是一个scan两者不同的是,
snapshotScanMR是对于该表的snapshot去做查找,直接查询底层hdfs,而对于TableScanMR来说它对原表去做访问,
所以它还是会去访问对应的regionServer。这样就清楚了他们的用途了,对于速度来说snapshotScanMR更快,他比较
适合用于离线数据,而TableScanMR来说比较试用于实时的数据。这两种方式一般都用于要查询大量数据或者OLAP场景中。

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  hbase scan