看过Hbase 读流程的代码的同学 对scanner这个词应该不会陌生
Hbase 在读流程时 具体是怎么围绕scanner展开的,最近仔细地看了代码后算是弄清了
HBase中的scanner实例关系如下图
首先,无论是GET还是scan的读数据,都是从RegionScanner的next接口中获取
第二,scanner可分为两种InternalScanner和KeyValueScanner,区别如下:
1.InternalScanner,可以理解为包含其他scanner的scanner,它的主要接口为next(),作用是从其包含的scanner中获取下一个KeyValue,它的角色可以理解为雇佣KeyValueScanner
2.KeyValueScanner,从内存或文件中获取KeyValue的scanner,它的主要接口有peek(),seek(KeyValue key),next()等,其中next和peek都能获取scanner中的下一个KeyValue,但是next会移动iterator,peek不会,而seek就是将iterator定位到指定的KeyValue,如果不存在该KeyValue则定位到其后面的那个KeyValue,在scanner初始化的时候都会调用下seek接口,它的角色可以理解为服务InternalScanner
所以,对于图中的scanner, RegionScanner、StoreScanner属于InternalScanner,
而MemstoreScanner、StoreFileScanner、StoreScanner属于KeyValueScanner
第三,KeyValue 和 KeyValueScanner是可以比较大小的,即他们在优先队列里是排序存放的
1.KeyValue的大小比较规则,优先级从大到小依次为RowKey cf+cq timestamp type,
具体点比如说,在比较2个KeyValue时,先比较RowKey的大小('a' < 'b'),相同的情况下比较cf+cq的大小('cf1:q1'<'cf2:q1'<'cf2:q2'),如果还是相同的话就比较时间戳(3042211081<3042211080,
注意 我没写错,你没看错,时间戳的long值越大,表示数据越新,在从小到大的队列中越靠前),如果上述仍然还相同则比较TYPE('DeleteFamily' < 'DeleteColumn' < 'Delete' < Put)
2.KeyValueScanner的大小比较规则:其大小有peek()获取到KeyValue大小决定,即
KeyValueScanner1.peek() < KeyValueScanner2.peek() 则KeyValueScanner1 < KeyValueScanner2
看明白以上3点后,则读的流程就比较好懂了,
1.RegionScanner中有一个scanner的优先队列,当然里面放的是StoreScanner
2.StoreScanner中也有一个scanner的优先队列,里面放着地是MemStoreScanner和StoreFileScanner,
3.RegionScanner通过调用next()获取数据时,其实际是从他的scanner队列中poll出一个StoreScanner,然后调用StoreScanner.next()来获取数据,最后再将该StoreScanner继续添加进优先队列中,从而保证队列中的scanner是一直正确有序的
4,3中的StoreScanner.next(),其实际是从他的scanner队列中poll出一个StoreFileScanner或者是MemStoreScanner,然后调用next(),再将该scanner添加进队列中
- 大小: 45.1 KB
分享到:
相关推荐
这个源代码包是针对Java开发者的宝贵资源,可以帮助他们深入理解HBase的内部工作原理,优化自己的应用,以及对HBase进行定制化开发。 HBase的核心概念包括: 1. 表(Table):HBase的数据存储在表中,每个表由行键...
在Java中操作HBase数据库时,我们经常需要对大量数据进行高效的检索和处理。...提供的源代码应该包含如何创建、应用PageFilter以及处理扫描结果的完整示例,这对于学习和实践HBase的分页查询非常有帮助。
hive编译,jars,HBaseScanner构建.pptx,HBase之RegionServer命令启动流程.pptx,扩展.docx,尚硅谷大数据技术之HBase.xmind,尚硅谷大数据技术之HBase.pdf等等 很全。
通过阅读《HBase 权威指南》的源代码,开发者不仅可以理解HBase的设计理念,还能学习到如何利用HBase解决实际问题,提升大数据处理的能力。无论是初学者还是经验丰富的开发者,这本书都将是提升HBase技能的宝贵资源...
本文将深入探讨HBase的比较过滤器RowFilter的使用源码,帮助你理解如何在实际项目中应用这一关键功能。 RowFilter是HBase提供的过滤器之一,它允许我们根据行键(row key)来过滤表中的数据。在Java API中,我们...
HBase是构建在Hadoop生态系统之上的,用于处理大规模数据的NoSQL数据库,尤其适合实时读写操作。这本书的示例代码提供了丰富的实践案例,帮助读者更好地理解和应用HBase的核心概念和技术。 在HBase中,数据被组织成...
在`src`目录下的Java源代码中,可以找到如下关键操作的实现: 1. **连接HBase**:通过`Configuration`对象设置HBase的配置,如ZooKeeper地址,然后使用`Connection`工厂创建连接。 ```java Configuration config =...
在开发过程中,了解源码可以帮助我们更好地理解过滤器的工作原理。HBase的源码提供了丰富的注释和示例,可以加深对过滤器实现的理解。 总之,HBase过滤器是数据查询和分析的强大工具。正确地使用过滤器不仅可以提高...
HBase是一个分布式的、可扩展的列式数据库,它建立在Hadoop之上,适用于实时读写大数据。本篇文章将深入探讨如何使用Java API与HBase进行交互。 首先,我们需要了解HBase的主要组件: 1. **表(Table)**:HBase中...
- 使用`javac`命令编译Java源代码文件,确保`-classpath`参数正确地指定了Hadoop和HBase的`.jar`文件路径。 - 编译后的类文件会被放置在指定的目标目录中。 3. **打包**:使用`jar`命令将编译好的类文件打包成一个...
为了深入了解“test_hbase - feed 插入,查询”,你需要查看压缩包中的源代码和文档,了解具体的实现细节,包括如何设置配置,如何定义表结构,以及如何编写插入和查询的逻辑。同时,理解HBase的分布式特性,如 ...
- 进入HBase源码包中的`src/main/resources/org/apache/hadoop/hbase/thrift/`目录。 - 执行命令生成Python客户端代码: ```bash thrift --gen py Hbase.thrift ``` - 将生成的代码移动到Python的库路径中,如...
SpringBoot简化了Spring应用的初始搭建以及开发过程,它集成了大量常用的第三方库配置,如数据源、JPA、MVC等,开发者可以“开箱即用”。在创建项目时,我们可以选择Spring Initializr来快速生成基础项目结构,包括...
HBase,全称是Apache HBase,是一个分布式的、面向列的开源数据库,它属于Apache软件基金会的Hadoop项目之一。HBase是为非结构化数据设计的,尤其适合大规模大数据存储。它在Google Bigtable的基础上构建,提供了...
本话题主要涵盖了三个方面的知识点:用户行为分析系统、HBase的模糊查询以及MapReduce在处理数据源联合统计中的应用。 1. 用户行为分析系统: 用户行为分析系统是用于收集、处理、分析用户在网站或应用上的交互行为...