我有几个HBase表。它们的密钥都不同,但是每个密钥都有32位整数所有者ID作为密钥的一部分。每个表的偏移量都不同,但是我确实知道这些偏移量。
现在,我传入了一个ID集合,我需要将与传入的所有者有关的数据转储到文件中。即我需要做一些等效于以下SQL语句的事情:
SELECT * FROM table WHERE substr(key_field, offset, length) IN (...);
为了做到这一点,我写了这样的东西:
public class SubKeyComparator extends BinaryComparator {
private Set<Integer> idSet;
private int idLength = 4;
private int idOffset = 0;
// getters/setters are here
@Override
public int compareTo(byte[] value) {
return idSet.contains(Bytes.toInt(value, offset, length))? 0 : 1;
}
}
它似乎未按预期工作。
它实际上根本不起作用。我正在打开一张桌子,当我试图获得
ResultScanner scanner = htable.getScanner(scan);
它稍等片刻,然后抛出一个org.apache.hadoop.hbase.client.RetriesExhaustedException,其中显示了十二个java.io.EOFExceptions
org.apache.hadoop.hbase.client.HConnectionManager $ HConnectionImplementation.getRegionServerWithRetries(HConnectionManager.java:1231)
尝试在Web上找到解决方案或了解通过HBase源代码出了什么问题并没有产生任何明显的结果。
如果我不将过滤器插入扫描对象,则一切正常。
如果有人知道出了什么问题或做了类似的事情,将非常感谢您的帮助。
最佳答案
首先重要的是要注意您已经实现了比较器,而不是过滤器。如果您确实想要过滤器,则需要扩展org.apache.hadoop.hbase.filter.FilterBase
如果查看HBase日志,可能会看到以下内容:
2012-09-20 16:55:27,913 ERROR org.apache.hadoop.hbase.io.HbaseObjectWritable: Can't find class com.mycompany.project.MyCustomComparator
java.lang.ClassNotFoundException: com.mycompany.project.MyCustomComparator
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
{lines removed for brevity}
2012-09-20 16:55:27,913 ERROR org.apache.hadoop.hbase.io.HbaseObjectWritable: Error in readFields
java.io.IOException: Can't find class com.mycompany.project.MyCustomComparator
at org.apache.hadoop.hbase.io.HbaseObjectWritable.readObject(HbaseObjectWritable.java:514)
{lines removed for brevity}
Caused by: java.lang.ClassNotFoundException: com.mycompany.project.MyCustomComparator
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
{lines removed for brevity}
at org.apache.hadoop.hbase.io.HbaseObjectWritable.getClassByName(HbaseObjectWritable.java:549)
at org.apache.hadoop.hbase.io.HbaseObjectWritable.readObject(HbaseObjectWritable.java:511)
... 15 more
这是因为比较器类在HBase服务器的类路径中不可用。
无论哪种情况,都需要将定制类编译并部署到所有区域服务器(可能在JAR中)并添加到HBase类路径中。