2015-02-15 3 views
2

Я получаю таймауты с ошибкой, появляющейся из моего настраиваемого фильтра. Ошибка ниже:Как преобразовать пользовательский фильтр из HBase 0.94 в HBase 0.98, который не использует никаких протонов?

Caused by: org.apache.hadoop.hbase.exceptions.DeserializationException: parseFrom called on base Filter, but should be called on derived type 

Я вижу, что записи и считывания полей больше не поддерживаются в Hbase 0.98. В настоящее время мои методы для записи и readFields следующим образом:

public MyCustomFilter(Schema first) { 
    this.schema = first; 
    filterNow(); 
} 

public void write(DataOutput o) throws IOException { 
    byte[] firstBytes = Bytes.toBytes(first.toString()); 
    out.writeInt(firstBytes.length) 
} 

public void readFields(DataInput i) throws IOException { 
    int firstLength = i.readInt(); 
    byte firstBytes = new byte[firstLength]; 
    i.readFully(firstBytes, 0, firstLength); 
    this.first = new Schema.Parser().parse(new ByteArrayINputStream(firstBytes); 
    filterNow(); 
} 

private void filterNow() { 
    FilterQueryParser parser = new FilterQueryParser(first); 
    .... 
} 

Cloudera кажется, думает, что это только вопрос о переносе этих методов:

FilterBase no longer implements Writable. This means that you do not need to implement readFields() and write() methods when writing your own custom fields. Instead, put this logic into the toByteArray and parseFrom methods. See this page for an example. 

Однако образец при условии, SingleColumnValueFilter, как представляется, использовать ProtoBufs из Filter.Protos, который, как представляется, содержит SingleColumnValueFilter, который является основой для HBase ... Мой CustomFilter не использует ничего подобного, я вообще не использую protobuf. Есть ли способ конвертировать то, что у меня есть, что делает hbase 0.98 счастливым? O (Schema.parser является avro). Мне нужно использовать Filter.Protos сейчас? Если да, то как?

ответ

0

Вы должны реализовать метод public byte[] toByteArray() вместо public void write(DataOutput o), чтобы сериализовать экземпляр фильтра на вашей стороне клиента для отправки на серверный сервер HBase.

Аналогичным образом вы должны реализовать метод public static Filter parseFrom(final byte[] pbBytes) вместо public void readFields(DataInput i), чтобы поток байтов можно было читать со стороны сервера и транслировать в экземпляр вашего фильтра с помощью HBase.

К сожалению, кажется, что мы потеряли полезные объекты DataInput и DataOutput, которые были доступны в версии 0.94. Теперь нам нужно обработать массив исходных байтов. Например, чтобы написать String вместо использования DataOutput.writeUTF и DataInput.readUTF, мы должны «вручную» записать int перед строкой в ​​массиве байтов, чтобы узнать количество байтов, связанных с предстоящей строкой.

Во всяком случае, моя «ручная» обработка массива байтов для сериализации и десерализации фильтра, работающего для настраиваемого фильтра на HBase 1.0.2.

Смежные вопросы