2016-12-08 4 views
2

Мне сложно работать с HBase FuzzyRowFilter.HBase FuzzyRowFilter не возвращает результатов

Я следующий тест таблицы:

hbase(main):014:0> scan 'test' 
ROW         COLUMN+CELL 
row-01        column=colfam1:col1, timestamp=1481193793338, value=value1 
row-02        column=colfam1:col1, timestamp=1481193799186, value=value2 
row-03        column=colfam1:col1, timestamp=1481193803941, value=value3 
row-04        column=colfam1:col1, timestamp=1481193808209, value=value4 
row-05        column=colfam1:col1, timestamp=1481193812737, value=value5 
5 row(s) in 0.0200 seconds 

Здесь мой Java-код (я начал с Scala, но результаты не совпадают - нет):

Configuration conf = HBaseConfiguration.create(); 
    conf.set("hbase.zookeeper.quorum", "localhost:2182"); 
    conf.set("hbase.master", "localhost:60000"); 
    conf.set("hbase.rootdir", "/hbase"); 


    try { 
     Scan scan = new Scan(); 
     scan.setCaching(5); 

     byte[] rowKeys = Bytes.toBytesBinary("???-01"); 
     byte[] fuzzyInfo = {0x01,0x01,0x01,0x00,0x00,0x00}; 
     FuzzyRowFilter fuzzyFilter = new FuzzyRowFilter(
       Arrays.asList(
         new Pair<byte[], byte[]>(
           rowKeys, 
           fuzzyInfo))); 

     System.out.println("### fuzzyFilter: " + fuzzyFilter.toString()); 

     scan.addFamily(Bytes.toBytesBinary("colfam1")); 
     scan.setStartRow(Bytes.toBytesBinary("row-01")); 
     scan.setStopRow(Bytes.toBytesBinary("row-05")); 
     scan.setFilter(fuzzyFilter); 

     Connection conn = ConnectionFactory.createConnection(conf); 
     Table table = conn.getTable(TableName.valueOf("test")); 
     ResultScanner results = table.getScanner(scan); 

     int count = 0; 
     int limit = 100; 
     for (Result r : results) { 
      System.out.println("" + r.toString()); 
      if (count++ >= limit) break; 
     } 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

Я просто не получить любые результаты с сервера. Если я закомментируйте строку scan.setFilter(fuzzyFilter);, я получаю exepcted результаты:

keyvalues={row-01/colfam1:col1/1481193793338/Put/vlen=6/seqid=0} 
keyvalues={row-02/colfam1:col1/1481193799186/Put/vlen=6/seqid=0} 
keyvalues={row-03/colfam1:col1/1481193803941/Put/vlen=6/seqid=0} 
keyvalues={row-04/colfam1:col1/1481193808209/Put/vlen=6/seqid=0} 

я делаю что-то не так? Есть ли ошибка в HBase (версия 1.2.2)? Я использую версию, установленную через Homebrew на последней версии Mac OS Sierra.

Обновление

В кластере Cloudera Hadoop под управлением CDH 5.7 с HBase 1.2.0-cdh5.7.0, я получить желаемый выход для RowKey row-01. Ошибка должна быть связана с моей локальной настройкой.

Решение

Действительно, проблема заключалась в том, что Hbase установки сервера и клиента JAR версии не совпадают. В моем случае, я использовал артефакты

  • HBase-общие
  • HBase-клиент
  • HBase-сервер

с версией 1.2.0-cdh5.7.0 вместо 1.2.2.

Моя ошибка предполагала, что незначительные различия в версии не будут иметь большого влияния, но, по-видимому, Cloudera применил некоторые существенные изменения в своих версиях относительно официальной базы кода. Переход на официальную версию 1.2.2 сделал FuzzyRowFilter работы должным образом.

+0

Помогло ли downvoter объяснить, почему (а) он отказался от моего вопроса?Я считаю, что в нем четко говорится о проблеме и моих предыдущих попытках ее решения. – pederpansen

ответ

1

Он должен печатать только rowkey строки row-01, что может быть воспринято из условия фильтра. Нет такой ошибки, и она будет работать так, как ожидалось, поскольку я использую ее в течение некоторого времени. Проверьте свои конфигурации, зависимости и т. Д. Из-за версий, много раз библиотеки и их клиенты становятся несовместимыми. Давайте рассмотрим простой пример:

class ServerVersionA { 
public static void getData() { 
    return DataOject(data with headerVersionA); 
} 

}

class ClientVersionB { 
public void showData() { 
    DataObject dataObject = makeRequest(params); 
    //Check whether data recieved is of version B after veryfying header           boolean status=validate(dataObject); 
    if (status) { 
     doIO(dataObject); 
    } 
} 

}

В этом случае, если заголовок не соответствует, клиент делает просто сидеть сложа руки. Эти проблемы в основном позаботятся, но иногда они ползут. Если мы посмотрим на источники установки и клиентскую версию, мы можем узнать, почему данные не возвращаются и распространение исключений не распространяется.

+0

Замечательно, что вы получили фильтр для работы. Но разве вы не согласны с тем, что поведение сервера HBase странно? Если существует несоответствие зависимостей или конфигураций, не следует ли сервер сообщать об ошибке вместо того, чтобы возвращать пустой результат? Во всяком случае, я был бы рад * конкретным * намекам на решение моей проблемы. – pederpansen

+1

Он делает это в большинстве случаев, но в таких случаях, как несоответствие версии (jar и установка), он делает вид no-op, не бросая даже предупреждений. –

+0

Например, вы можете обратиться к [link] (http://stackoverflow.com/questions/40676953/hbase-client-api-not-connecting-to-hbase/41040415?noredirect=1#comment69289550_41040415) и посмотреть на проблему и решение. –