Пользовательская фильтрация таблицы HBase в Java

У меня есть несколько таблиц HBase. Все они имеют разные ключи, но каждый ключ имеет 32-битный целочисленный идентификатор владельца как часть ключа. Для каждой таблицы это смещение разное, но я знаю эти смещения. Теперь я передан в коллекцию идентификаторов, и мне нужно вывести данные, относящиеся к переданным владельцам, в файл. т.е. Мне нужно сделать что-то эквивалентное следующему оператору 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.EOFException в org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.getRegionServerWithRetries(HConnectionManager.java:1231 )

Попытки найти решение в сети или понять, что не так в исходном коде HBase, не дали существенных результатов. Если я не вставляю свой фильтр в объект проверки, все работает нормально.

Если кто-то знает, что не так, или сделал что-то подобное, ваша помощь будет очень признательна.


person Gary    schedule 26.04.2012    source источник
comment
Вы знаете, что даже когда вы заставите это работать, это будет крайне неэффективно, т.е. просматривая каждую строку в таблицах, где идентификатор владельца не является самой левой частью ключа.   -  person Arnon Rotem-Gal-Oz    schedule 27.04.2012
comment
Да, я это знаю. К сожалению, это еще нужно сделать.   -  person Gary    schedule 27.04.2012


Ответы (1)


Во-первых, важно отметить, что вы внедрили Компаратор, не фильтр. Если вам действительно нужен фильтр, вам нужно расширить 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.

person Tim Hennekey    schedule 20.09.2012
comment
Можно ли связать пользовательские фильтры с jar-файлом Job (то есть с тем же jar-файлом, в котором есть мой преобразователь, редуктор и основной класс)? - person Carlos Macasaet; 15.02.2014