过滤数据
到现在为止你了解到HBase拥有灵活的逻辑模式和简单的物理模型,它们允许应用系统的计算工作更接近硬盘和网络,并在这个层次进行优化。设计有效的模式是使用HBase的一个方面,你已经掌握了一堆概念用来做到这点。你可以设计行键以使访问的数据在硬盘上也存放在一起,所以读写操作时可以节省硬盘寻道时间。在读取数据时,你经常需要基于某种标准进行操作,你可以进一步优化数据访问。过滤器就是在这种情况下使用的一种强大的功能。
我们还没有谈到使用过滤器的真实使用场景;一般来说调整表设计就可以优化访问模式。但是有时你已经把表设计调整得尽可能好了,为不同访问模式优化得尽可能好了。当你仍然需要减少返回客户端的数据时,这就是考虑使用过滤器的时候了。有时侯过滤器也被称为下推判断器(push-down predicates),支持你把数据过滤标准从客户端下推到服务器(如图4.16)。这些过滤逻辑在读操作时使用,对返回客户端的数据有影响。这样通过减少网络传输的数据来节省网络IO。但是数据仍然需要从硬盘读进RegionServer,过滤器在RegionServer里发挥作用。因为你有可能在HBase表里存储大量数据,网络IO的节省是有重要意义的,并且先读出全部数据送到客户端再过滤出有用的数据,这种做法开销很大。
图 4.16 在客户端完成数据过滤:从RegionServer把数据读取到客户端,在客户端使用过滤器逻辑处理数据;或者在服务器端完成数据过滤:把过滤逻辑下推到RegionServer,因此减少了在网络上传输到客户端的数据量。实质上过滤器节省了网络IO的开销,有时甚至是硬盘IO的开销。
HBase提供了一个API,你可以用来实现定制过滤器。多个过滤器也可以捆绑在一起使用。可以在读过程最开始的地方,基于行健进行过滤处理。此后,也可以基于HFile读出的KeyValues进行过滤处理。过滤器必须实现HBase Jar包中的Filter接口,或者继承扩展一个实现了该接口的抽象类。我们推荐继承扩展FilterBase抽象类,这样你不需要写样板代码。继承扩展其他诸如CompareFilter类也是一个选择,同样可以正常工作。当读取一行时该接口有下面的方法在多个地方可以调用(顺序如图4.17)。它们总是按照下面描述的顺序来执行:
1 这个方法第一个被调用,基于行健执行过滤:
boolean filterRowKey(byte[] buffer, int offset, int length)
基于这里的逻辑,如果行被过滤掉了(不出现在发送结果集合里)返回true,否则如果发送给客户端则返回false。
2 如果该行没有在上一步被过滤掉,接着调用这个方法处理当前行的每个KeyValue对象:
ReturnCode filterKeyValue(KeyValue v)
这个方法返回一个ReturnCode,这是在Filter接口中定义的一个枚举(enum)类型。返回的ReturnCode判断某个KeyValue对象发生了什么。
3 在第2步过滤KeyValues对象后,接着是这个方法:
void filterRow(List kvs)
这个方法被传入成功通过过滤的KeyValue对象列表。倘若这个方法访问到这个列表,此时你可以在列表里的元素上执行任何转换或运算。
4 如果你选择过滤掉某些行,此时这个方法再一次提供了这么做的机会:
boolean filterRow()
过滤掉考虑中的行,则返回true。
5 你可以在过滤器里构建逻辑来提早停止一次扫描。你可以把该逻辑放进这个方法:
boolean filterAllRemaining()
当你扫描很多行,在行健、列标识符或单元值里查找指定东西时,一旦找到目标,你就不再关心剩下的行了。此时这个方法用起来很方便。这是过滤流程中最后调用的方法。
图 4.17 过滤流程的各个步骤。扫描器对象扫描范围里的每行都会执行这个流程。
另一个有用的方法是reset()。它会重置过滤器,在被应用到整行后由服务器调用。
注意 这个API很强大,但是我们不觉得它是在应用系统里大量使用的。许多情况下,如果模式设计改变了,使用过滤器的需求也会改变。
分享到:
相关推荐
HBase过滤器允许我们在读取数据时对结果进行筛选,减少不必要的I/O操作,从而提高效率。它们是通过实现`Filter`接口来定义的,并在扫描器(Scanner)执行时应用。HBase提供了多种内置过滤器,如...
Hbase过滤器详解,基础篇
过滤器可以根据列族、列、版本等更多的条件来对数据进行过滤,基于 HBase 本身提供的三维有序(行键,列,版本有序),这些过滤器可以高效地完成查询过滤的任务,带有过滤器条件的 RPC 查询请求会把过滤器分发到各个...
HBase提供了多种过滤器机制,其中PageFilter是一种非常实用的工具,它可以帮助我们在查询时限制返回的结果数量,从而优化性能和内存使用。下面我们将深入探讨PageFilter的使用方法,并通过源代码示例来解释其工作...
本文将深入探讨HBase的比较过滤器RowFilter的使用源码,帮助你理解如何在实际项目中应用这一关键功能。 RowFilter是HBase提供的过滤器之一,它允许我们根据行键(row key)来过滤表中的数据。在Java API中,我们...
布隆过滤器是一种高效的空间节约型数据结构,用于判断一个元素是否可能存在于一个大型集合中。它由布隆于1970年提出,主要利用了位数组和多个哈希函数来实现。基本思想是通过将元素经过多个独立的哈希函数映射到一个...
通过对HBase的使用注意事项进行深入分析,我们了解到在表设计阶段应当重视RowKey的设计及其对数据分布的影响,同时还需要考虑压缩算法、过滤器的选择以及版本控制等因素。此外,对于Java API的使用也需要注意资源...
3. 查询过滤:支持多种过滤器查询是HBase数据库界面管理器的一大亮点。用户可以使用行键、列族、列限定符和时间戳等条件组合,构建复杂的查询语句,快速定位所需数据。 4. 导入导出:工具提供数据导入和导出功能,...
HBase还提供了过滤器来优化查询,例如单列值过滤器、列前缀过滤器、分页过滤器等,这些过滤器可以在服务器端执行,从而减少了不必要的数据传输。 压缩是HBase表设计时的另一个重要考虑因素。通过压缩可以减少存储...
4. **HBase的过滤器机制**:过滤器是HBase查询性能优化的关键。通过使用行过滤器、列过滤器、时间戳过滤器等,可以在服务器端提前过滤掉不需要的数据,减少网络传输和客户端处理的压力。 5. **HBase的MapReduce支持...
课时8:过滤器实战之专用过滤器与FilterList 课时9:过滤器实战之自定义过滤器 课时10:Observer协处理器实战之Master级别原理剖析 课时11:Observer协处理器实战之Region级别原理剖析 课时12:Observer协处理器...
Filter是HBase中的一种过滤器,用于过滤查询结果。在本文中,作者使用了FirstKeyOnlyFilter和SingleColumnValueFilter来实现分页查询。 知识点7:ResultScanner的使用 ResultScanner是HBase中的一种结果扫描器,...
同时,HBase支持过滤器,可以进一步优化查询效率。HBase还支持Secondary Index,虽然不如传统关系型数据库那样完善,但可以通过 Coprocessors 或者索引服务如 phoenix 来实现。 在实际应用中,HBase常用于日志分析...
HBase过滤器可以根据条件过滤数据。例如,使用RowFilter过滤器来过滤Student表中的数据: scan 'Student', FILTER => "RowFilter(=, 'binary:0001')" HBase行键过滤器 ------------------ HBase行键过滤器用于...
4. **处理数据**:根据业务需求,可能需要对HBase中的数据进行转换或过滤,以适应Elasticsearch的索引结构。例如,处理HBase的行键和列族,转换为Elasticsearch的文档ID和字段。 5. **错误处理和重试策略**:由于...
3. 查询数据:`get '表名', '行键'`获取整行数据,或`scan '表名'`进行全表扫描,可以指定过滤器等条件。 4. 删除数据:`delete '表名', '行键', '列族:列限定符', [时间戳]`删除特定单元格,可选时间戳指定版本。 ...
在实际开发中,你可能还需要处理异常、实现更复杂的查询逻辑、使用过滤器或者与其他系统集成。理解HBase的表结构、行键设计、列族和时间戳等概念对于有效地使用Scala API操作HBase至关重要。同时,熟悉HBase的...
4. **优化过滤器**:使用高效的过滤器可以减少不必要的网络传输和计算。 5. **监控性能**:定期检查HBase集群的CPU、内存和磁盘使用情况,确保系统的健康运行。 Java-HBase开发包是连接Java应用和HBase数据库的...