关于hbase中scan的一些总结

首先,对于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场景中。
 
	






  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值