2012-04-26 8 views
0

複数のHBaseテーブルがあります。それらはすべて異なる方法でキーイングされますが、すべてのキーは32ビットの整数オーナIDをキーの一部として持っています。それはテーブルごとに異なってオフセットされますが、私はこれらのオフセットを知っています。 今、私はIDのコレクションに渡され、渡された所有者に関するデータをファイルにダンプする必要があります。私。私は、次のSQL文と同じ何かをする必要があります。意図したとおりにそれが機能していない登場JavaのHBaseテーブルのカスタムフィルタリング

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; 
    } 
} 

SELECT * FROM table WHERE substr(key_field, offset, length) IN (...); 

は、私がこのような何かを書かれていることを達成しようとしています。 実際には全く動作しません。私は、テーブルを開いていると私は

ResultScanner scanner = htable.getScanner(scan); 

を取得しようとしていたときにそれは少し待ってから 組織でjava.io.EOFExceptionsのダースを示すorg.apache.hadoop.hbase.client.RetriesExhaustedExceptionをスローします.apache.hadoop.hbase.client.HConnectionManager $ HConnectionImplementation.getRegionServerWithRetries(HConnectionManager.java:1231)

Web上で解決策を見つけたり、HBaseのソースコードの何が間違っているかを理解しようとすると、大きな結果が得られませんでした。 フィルタをスキャンオブジェクトに挿入しないと、すべて正常に動作します。

誰かが間違っていることを知っていたり、似たようなことをしていると、あなたの助けに感謝します。

+0

これを有効にしても、所有者IDがキーの一番左の部分ではないテーブル内のすべての行を処理することは非常に効率が悪いことにご注意ください。 –

+0

はい、わかります。残念ながら、それでもやる必要があります。 – Gary

答えて

2

まず、コンパレータを実装していることに注意することが重要です。です。コンパレータのクラスではないので、これはある

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のログを調べる場合は、次のようなものが表示される場合がありますorg.apache.hadoop.hbase.filter.FilterBase

を拡張していますHBaseサーバーのクラスパスで使用できます。

いずれの場合も、カスタムクラスをコンパイルしてすべてのリージョンサーバー(おそらくJAR)に展開し、HBaseクラスパスに追加する必要があります。

+0

では、カスタムフィルタをJob jar(つまり、マッパー、レデューサー、メインクラスを持つ同じjar)とバンドルすることは可能ですか? –

関連する問題