hbase 自定义过滤器问题
hbase自带的原有过滤器,调用都没问题
但是自己写的过滤器却始终报错,显示找不到类
CLASSPATH已经设置,指向 hbase/lib 文件夹下, 自定义过滤器也打包jar 拷贝到每台服务端 hbase/lib文件夹下
hbase也重新启动。
请问谁知道怎么回事?
报错日志:
Exception in thread "main" java.lang.NoClassDefFoundError: hadoop/FlowFilter
at hadoop.shellcom.filterHbase(shellcom.java:471)
at hadoop.shellcom.main(shellcom.java:511)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.apache.hadoop.util.RunJar.main(RunJar.java:197)
Caused by: java.lang.ClassNotFoundException: hadoop.FlowFilter
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
自定义过滤器代码:(拷贝的RowFilter源码)
package hadoop;
import org.apache.hadoop.hbase.filter.*;
import org.apache.hadoop.hbase.KeyValue;
import org.apache.hadoop.hbase.client.Scan;
import java.util.List;
public class FlowFilter extends CompareFilter {
private boolean filterOutRow = false;
/**
* Writable constructor, do not use.
*/
public FlowFilter() {
super();
}
/**
* Constructor.
* @param rowCompareOp the compare op for row matching
* @param rowComparator the comparator for row matching
*/
public FlowFilter(final CompareOp rowCompareOp,
final WritableByteArrayComparable rowComparator) {
super(rowCompareOp, rowComparator);
}
@Override
public void reset() {
this.filterOutRow = false;
}
@Override
public ReturnCode filterKeyValue(KeyValue v) {
if(this.filterOutRow) {
return ReturnCode.NEXT_ROW;
}
return ReturnCode.INCLUDE;
}
@Override
public boolean filterRowKey(byte[] data, int offset, int length) {
if(doCompare(this.compareOp, this.comparator, data, offset, length)) {
this.filterOutRow = true;
}
return this.filterOutRow;
}
@Override
public boolean filterRow() {
return this.filterOutRow;
}
}
但是自己写的过滤器却始终报错,显示找不到类
CLASSPATH已经设置,指向 hbase/lib 文件夹下, 自定义过滤器也打包jar 拷贝到每台服务端 hbase/lib文件夹下
hbase也重新启动。
请问谁知道怎么回事?
报错日志:
Exception in thread "main" java.lang.NoClassDefFoundError: hadoop/FlowFilter
at hadoop.shellcom.filterHbase(shellcom.java:471)
at hadoop.shellcom.main(shellcom.java:511)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.apache.hadoop.util.RunJar.main(RunJar.java:197)
Caused by: java.lang.ClassNotFoundException: hadoop.FlowFilter
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
自定义过滤器代码:(拷贝的RowFilter源码)
package hadoop;
import org.apache.hadoop.hbase.filter.*;
import org.apache.hadoop.hbase.KeyValue;
import org.apache.hadoop.hbase.client.Scan;
import java.util.List;
public class FlowFilter extends CompareFilter {
private boolean filterOutRow = false;
/**
* Writable constructor, do not use.
*/
public FlowFilter() {
super();
}
/**
* Constructor.
* @param rowCompareOp the compare op for row matching
* @param rowComparator the comparator for row matching
*/
public FlowFilter(final CompareOp rowCompareOp,
final WritableByteArrayComparable rowComparator) {
super(rowCompareOp, rowComparator);
}
@Override
public void reset() {
this.filterOutRow = false;
}
@Override
public ReturnCode filterKeyValue(KeyValue v) {
if(this.filterOutRow) {
return ReturnCode.NEXT_ROW;
}
return ReturnCode.INCLUDE;
}
@Override
public boolean filterRowKey(byte[] data, int offset, int length) {
if(doCompare(this.compareOp, this.comparator, data, offset, length)) {
this.filterOutRow = true;
}
return this.filterOutRow;
}
@Override
public boolean filterRow() {
return this.filterOutRow;
}
}
...全文
相关推荐
Hbase行键设计(rowkey)实现多条件查询
实现多条件查询时,可以使用HBase的自定义比较器(Comparator)和过滤器(Filter)。例如,创建一个相等比较器用于实现精确匹配查询,另一个范围比较器用于执行范围查询。
hbase权威指南源码
**扩展性与插件**:HBase允许开发自定义的Region服务器插件,源码可能会展示一些实际的应用场景。
java-hbase开发包
**过滤器和比较器**:通过使用`Filter`接口,开发者可以实现复杂的数据筛选逻辑,如基于特定条件的查询。同时,`Comparator`接口允许自定义列值的比较规则。6.
HBase Design Patterns
《HBase设计模式》这本书是深入理解HBase数据库架构与应用的重要参考资料,它涵盖了HBase在实际场景中的最佳实践和常见问题解决方案。
Hbase自定义过滤器
1.1、下载protobuf-2.5.0解压,windows下额外下载protoc-2.5.0-win32,解压后将protoc.exe 放在protobuf-2.5.0的src目录下。


其他数据库
