一.概述
- 客户端创建包含过滤器Filter的Scan。
- Scan通过RPC被发送给RegionServer,在服务器端执行过滤操作。
- Scan的作用域是region,所以一个RegionServer有多个region的话,Scan将被发送到每个region。
二.Filter工作流程
你必须知道的是,HBase里的一行数据对应一或者多个KeyValue。再来看看流程。
- boolean fiterRowKey(byte[] buffer, int offset, int length):检查rowkey。返回true代表被过滤掉,false进入下个方法。
- ReturnCode fiterKeyValue(KeyValue v):检查rowkey下特定的某一个KeyValue。它有五种返回值,常见的ReturnCode.INCLUDE代表结果中包含这个KeyValue,Skip代表不包含,继续下处理一个KeyValue。
- void filterRow(List<KeyValue> ignored):ignored是2里面被过滤掉的KeyValue集合。
- boolean filterRow():返回true代表过滤掉当前行。
- void reset():迭代每一个新的RowKey(步骤1)前调用此方法。
- boolean filterAllRemaining():返回true时代表终止整个扫描操作。如用户找到了需要的所有数据,就在这里可以返回true。
三.例子
说这么多,不如一个实际的例子来的方便。
用户表rowkey为用户名称,cf:age代表年龄,cf:pw代表密码。现在需要找出用户,有三个限制条件
- 看到zzy这个用户直接pass,因为它是个技术狂人。
- 找出密码长度小于4的用户,用户信息不需要包含pw列。
- 只找出满足上述条件的两个用户。
public class PasswordStrengthFilter extends FilterBase { private int len; private int limit; private int rowsAccepted = 0; private boolean filterRow = false; public PasswordStrengthFilter() { super(); } public PasswordStrengthFilter(int len, int limit) { this.len = len; this.limit = limit; } @Override public boolean filterRowKey(byte[] buffer, int offset, int length) { String rowkey = Bytes.toString(buffer, offset, length); boolean iszzy = rowkey.equals("zzy"); return iszzy; } public ReturnCode filterKeyValue(KeyValue v) { if (Bytes.toString(v.getQualifier()).equals("pw")) { if (v.getValueLength() >= len) { this.filterRow = true; } return ReturnCode.SKIP; } return ReturnCode.INCLUDE; } @Override public void filterRow(List<KeyValue> ignored) { } public boolean filterRow() { if(!filterRow){ rowsAccepted ++ ; } return this.filterRow; } @Override public boolean filterAllRemaining() { return rowsAccepted >= limit; } public void reset() { this.filterRow = false; } public void write(DataOutput out) throws IOException { out.writeInt(len); out.writeInt(limit); } public void readFields(DataInput in) throws IOException { this.len = in.readInt(); this.limit = in.readInt(); } public static String getShortDes(KeyValue kv){ return "KeyValue["+Bytes.toString(kv.getRow()) + "\t" + Bytes.toString(kv.getFamily()) + ":" + Bytes.toString(kv.getQualifier()) + "=" + Bytes.toString(kv.getValue())+"]"; } }
new PasswordStrengthFilter(4, 2)的测试结果:请各位自己分析下每一行,每一个KeyValue是怎么被fiter处理的。
input: addData("david", TN, "age", "12"); addData("david", TN, "pw", "p1"); addData("zzy", TN, "age", "13"); addData("zzy", TN, "pw", "p2"); addData("zzz", TN, "age", "18"); addData("zzz", TN, "pw", "p456"); addData("zzzz", TN, "age", "18"); addData("zzzz", TN, "pw", "p4"); addData("zzzzz", TN, "age", "11"); addData("zzzzz", TN, "pw", "p6"); output: KeyValue[david cf:age=12] KeyValue[zzzz cf:age=18]
四.总结
- 一般返回true代表被过滤掉。
- 一个region上的所有数据共享一个Filter,并不是每来一行数据就new一个Filter来处理。所以例子中的rowsAccepted得以生效,变量filterRow的状态需要重置。
附件为测试代码和一个根据rowkey分页的RowPaginationFilter
相关推荐
8. **索引和查询优化**:虽然HBase主要依赖Row Key进行查询,但可以通过Secondary Index或布隆过滤器实现更复杂的查询优化。 9. **备份与恢复**:HBase提供了快照功能,可以定期创建数据快照,用于灾难恢复或数据...
此外,熟悉YARN(Yet Another Resource Negotiator)资源调度器的配置和使用也是必要的,因为Hadoop 3.x版本默认使用YARN作为任务调度器。 总的来说,这个压缩包提供了一整套大数据处理环境,涵盖了从数据存储到...
6. **索引和过滤器**:HBase支持索引和过滤器,以提高查询效率和数据筛选能力。 7. **HBase与Hadoop的集成**:HBase可以与Hadoop的其他组件(如Hive、Pig等)无缝集成,进行复杂的数据分析和处理。 学习这个课程,...
课时8:过滤器实战之专用过滤器与FilterList 课时9:过滤器实战之自定义过滤器 课时10:Observer协处理器实战之Master级别原理剖析 课时11:Observer协处理器实战之Region级别原理剖析 课时12:Observer协处理器...
- **高级功能**:HBase还提供了更多的高级功能,如过滤器(Filter)、批量操作(Batch)、观察者(Observer)等。 ### 面向的目标受众 该教程主要面向以下几类人群: - **希望从事大数据分析领域的专业人士**:包括软件...
Hadoop和HBase是大数据处理领域中的两个重要组件,它们分别负责分布式存储和实时数据访问。在本场景中,我们讨论的是Hadoop 3.2.4与HBase 2.5.8的版本组合。 **Hadoop 3.2.4** 是Apache Hadoop项目的一个稳定版本,...
4. **HBase的过滤器机制**:过滤器是HBase查询性能优化的关键。通过使用行过滤器、列过滤器、时间戳过滤器等,可以在服务器端提前过滤掉不需要的数据,减少网络传输和客户端处理的压力。 5. **HBase的MapReduce支持...
6. **过滤器机制**:HBase提供了一套强大的过滤器,可以根据条件筛选数据,提高查询效率。 7. **MapReduce集成**:HBase可以与Hadoop的MapReduce框架无缝集成,进行批量数据处理和分析。 8. **REST和Thrift接口**...
8. **过滤器(Filter)**:HBase支持多种过滤器,允许用户在查询时指定条件,提高查询效率。 9. ** Coprocessor机制**:HBase 0.98.6引入了Coprocessor框架,允许用户自定义插件在Region服务器端执行,实现数据的...
6. **过滤器机制**:HBase提供了丰富的过滤器类,如RowFilter、ColumnValueFilter等,用于在数据检索时进行条件筛选,提升查询效率。 7. **数据模型设计**:设计良好的HBase表结构对于实现高效查询至关重要。例如,...
- `bloomFilter`和`scope`: 分别是布隆过滤器类型和列的复制范围。 5. **HBase Shell常用命令**: HBase Shell提供了与HBase交互的命令行工具,包括创建表、删除表、插入数据、查询数据等操作。例如: - `create...
- **扫描器**:用于批量获取数据,可以通过过滤器进一步筛选结果。 - **批量加载**:HBase提供批量导入数据的工具,如HFile或MapReduce,提高数据导入效率。 4. **HBase高可用与容错** - **RegionServer故障恢复...
用户可以通过指定开始和结束键以及过滤器来定制扫描行为。 9. **Cell级别的安全性**: HBase支持细粒度的访问控制,可以为每个单元格(Cell)设置不同的权限。 10. **Compaction**: HBase会定期进行Major ...
在《HBase权威指南》的配套源码中,读者可以找到书中涉及的实例代码,这些代码涵盖了HBase的基本操作,如创建表、插入数据、查询数据、使用过滤器、进行批量操作等,以及更高级的主题,如HBase与Hadoop的交互、性能...
2. **扫描器(Scanner)**:用于批量读取数据,可以通过行键范围、时间戳范围或过滤器进行定制化查询。 3. **批量加载(Bulk Load)**:将数据预先加载到HDFS,然后一次性导入HBase,提高效率。 ### 四、HBase优化...
在本实验中,我们将深入学习如何在大数据环境中使用HBase,这是一个分布式列式数据库,它在Hadoop生态系统中扮演着重要角色。实验的目标是让你理解HBase在Hadoop架构中的地位,以及掌握通过Shell命令和Java API进行...
3. 其他功能:除了基本的CRUD操作,HBase还提供了许多扩展功能,如数据的过滤器、计数器以及协处理器等。 综上所述,HBase在处理大规模、多类型数据存储方面提供了优越的解决方案,它能够处理的数据规模和访问速度...