2010-08-26 11 views
1

Je suis en train de filtrer les lignes d'une table HBase en utilisant deux objets SingleColumnValueFilter pour ramener tous les dossiers qui se situent dans une plage de valeurs longues pour la colonne. Selon la documentation de SingleColumnValueFilter, il effectue une comparaison lexicographique de la valeur de la colonne sauf si vous lui transmettez votre propre comparateur. L'API affiche le SingleColumnValueFilter en prenant un WritableByteArrayComparable comme moyen d'accomplir ceci.Comment utilisez-vous un comparateur personnalisé avec SingleColumnValueFilter sur HBase?

j'ai écrit une classe et l'extension de la WritableByteArrayComparable la méthode comparer écraser.

public class LongWritableComparable extends WritableByteArrayComparable { 

    public LongWritableComparable() { 
     super(); 
    } 

    public LongWritableComparable(byte[] value) { 
     super(value); 
    } 

    public LongWritableComparable(Long value) { 
     super(Bytes.toBytes(value)); 
    } 

    @Override 
    public int compareTo(byte[] otherValue) { 
     byte[] thisValue = this.getValue(); 
     long thisLong = Bytes.toLong(thisValue); 
     long otherLong = Bytes.toLong(otherValue); 

     if (thisLong == otherLong) { 
      return 0; 
     } 
     if (thisLong < otherLong) { 
      return -1; 
     } 
     return 1; 
    } 
} 

Je settting le filtre à l'aide:

SingleColumnValueFilter lowerBoundAddressResourceFilter = new SingleColumnValueFilter(
        graphTable.getResource().getName(), 
        Bytes.toBytes(HBaseProperties.getInstance().getQualifierIpAdressLongRepresentation()), 
        CompareFilter.CompareOp.GREATER_OR_EQUAL, 
        new LongWritableComparable(lowerRangeValue)); 

mais je vois l'exception suivante:

2010-08-25 14:24:10,034 ERROR org.apache.hadoop.hbase.regionserver.HRegionServer: 
org.apache.hadoop.hbase.UnknownScannerException: Name: -1 
     at org.apache.hadoop.hbase.regionserver.HRegionServer.next(HRegionServer.java:1880) 
     at sun.reflect.GeneratedMethodAccessor5.invoke(Unknown Source) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
     at java.lang.reflect.Method.invoke(Method.java:597) 
     at org.apache.hadoop.hbase.ipc.HBaseRPC$Server.call(HBaseRPC.java:657) 
     at org.apache.hadoop.hbase.ipc.HBaseServer$Handler.run(HBaseServer.java:915) 
2010-08-25 14:24:10,052 INFO org.apache.hadoop.ipc.HBaseServer: IPC Server handler 0 on 60020, call next(-1, 1000) from 172.16.32.215:53206: error: org.apache.hadoop.hbase.UnknownScannerException: Name: -1 
org.apache.hadoop.hbase.UnknownScannerException: Name: -1 
     at org.apache.hadoop.hbase.regionserver.HRegionServer.next(HRegionServer.java:1880) 
     at sun.reflect.GeneratedMethodAccessor5.invoke(Unknown Source) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
     at java.lang.reflect.Method.invoke(Method.java:597) 
     at org.apache.hadoop.hbase.ipc.HBaseRPC$Server.call(HBaseRPC.java:657) 
     at org.apache.hadoop.hbase.ipc.HBaseServer$Handler.run(HBaseServer.java:915) 

la recherche sur le web le consensus pour la cause de cette Execption est que le code d'accès à la resultScanner.next() prend trop de temps entraînant le bail au regionServer à délai d'attente, mais cette exception se jette avant

ResultScanner resultScanner = table.getScanner(scan); 

revient avec un ResultScanner que je peux itérer.

Quelqu'un at-il ou si vous connaissez un exemple d'utilisation d'un comparateur personnalisé avec SingleColumnValueFilter qui fonctionne ou tout aperçu de ce que je fais mal?

Répondre

2

Il semble que le pot avec votre comparateur personnalisé doit être placé sur le serveur de région (s) où la table que vous interrogez résident dans le dossier HBASE_HOME $/lib. Après avoir placé le jar redémarrez votre cluster et la requête devrait fonctionner.

+0

Oui, probablement c'est assez pour le mettre sur classpath, mais j'ai aussi eu quelques problèmes avec ça. – wlk