关于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场景中。
相关文章推荐
- 关于IE6的一些总结
- 关于一些JAVA的基础知识总结
- 关于会话的一些总结
- 关于Activity的生命周期的一些总结
- 这是我们公司总结的一些关于中文乱码问题的一些解决方案和经验和大家分享!
- 关于在scrum中的一些总结
- 关于Xilinx FSL总线的一些总结
- 关于Java基础的一些笔试题总结
- 关于NoSQL之MongoDB的一些总结
- 关于android 系统选图crash问题的一些问题总结
- 关于Jekins的一些总结
- 关于C++中的虚拟继承的一些总结
- 关于isa的一些总结
- 关于地图拍照上传项目的一些总结
- 关于程序性能优化基础的一些个人总结
- 关于ASP.NET在IIS一些问题的经验总结
- 关于使用bootstrap的一些小总结
- 关于java 与 ajax之间调用的一些总结
- 关于记笔记的一些总结与思考(读Tcpip卷一有感)
- 个人总结的一些关于String、Function、Array的属性和用法