一、概述
在查询Hbase数据时,如果能巧妙使用其过滤器,可以减少数据的扫描范围,加快数据的查询,HBase中内置了很多过滤器,但内置的过滤器无法满足我们的需求时,可以自定义过滤器来实现我们的需求。二、过滤器调用顺序1、基于行键执行过滤:
boolean filterRowKey(byte[] buffer, int offset, int length);
如果行需要被过滤掉(不出现在结果集合中),返回true,反之返回false(也就是需要返回客户端)。
2、如果该行没有被第1步给过滤掉,接着调用这个方法处理当前行的每个KeyValue对象:
ReturnCode filterKeyValue(KeyValue v);
返回的ReturnCode决定该KeyValue对象将要发送的什么事情。
3、在第2步过滤KeyValue对象后,接着是这个方法:
void filterRow(List kvs);
这个方法被传入成功通过过滤的KeyValue对象列表(发送给客户端的列表)。倘若这个方法访问到这个列表,此时可以在这个列表中进行任何转换或运算。
4、如果还想过滤掉某些行,此时这个方法再一次提供了这个机会:
boolean filterRow();
返回true,将过滤掉正在计算的行。(不返回给客户端)
5、通过在过滤器中构造逻辑来提早停止一次扫描。就是这个方法:
boolean filterAllRemaining();
这是过滤器过滤过程中最后调用的一个方法。
void reset():重置过滤器
三、自定义过滤器1、继承FilterBase(可以少些点模板代码),并实现其中的方法filterKeyValue()、filterRow()、reset()、toByteArray()、parseFrom();其中的parseFrom父类中没有,直接编写方法即可,parseFrom方法前面如下:
public static Filter parseFrom(final byte[] pbBytes)throws DeserializationException
2、编写protobuf描述文件(*.proto)
3、使用protobuf编译定义的protobuf描述文件:
protoc -I=./ --java_out=../java
-I: 指定proto描述文件的父目录
--java_out: 指定java的类路径
4、将自定义的filter打包并上传到regionserver上(可以直接放入到lib目录下,也可以在hbase-env.sh目录中导入:export HBASE_CLASSPATH=custom-filter.jar目录)
5、在需要使用的地方导入自定义的filter
四、总结以上就是在HBase中自定义过滤器的全过程,可以看到还是比较简单的,简单的背后是HBase架构巧妙的设计的原因。这样我们就可以按照自己的需求来定义自己的过滤器。其中需要使用ptotobuf来进行编译描述文件。
扫码关注“破极大数据”,和破极一起学习大数据,努力年薪百万,走上人生巅峰!