0

我有几个 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,在 org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.getRegionServerWithRetries(HConnectionManager.java:1231 )

尝试在 Web 上找到解决方案或通过 HBase 源代码了解出了什么问题并没有产生任何显着的结果。如果我不将过滤器插入扫描对象,一切正常。

如果有人知道出了什么问题或做过类似的事情,我们将非常感谢您的帮助。

4

1 回答 1

2

首先重要的是要注意您已经实现了 Comparator ,而不是 filter。如果你真的想要一个过滤器,你需要做的是扩展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 类路径中。

于 2012-09-20T21:26:45.303 回答