0

いくつかの HBase テーブルがあります。それらはすべて異なるキーが付けられていますが、すべてのキーには、キーの一部として 32 ビット整数の所有者 ID があります。テーブルごとにオフセットが異なりますが、これらのオフセットは知っています。ここで、ID のコレクションが渡され、渡された所有者に関するデータをファイルにダンプする必要があります。つまり、次の 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.HConnectionManager$HConnectionImplementation.getRegionServerWithRetries(HConnectionManager.java:1231) で多数の java.io.EOFExceptions を示す org.apache.hadoop.hbase.client.RetriesExhaustedException をスローします。 )

Web で解決策を見つけようとしたり、HBase ソース コードを調べて何が問題なのかを理解しようとしたりしても、重要な結果は得られませんでした。フィルタをスキャン オブジェクトに挿入しなければ、すべて正常に動作します。

誰かが何が間違っているかを知っていたり、似たようなことをしたことがあるなら、あなたの助けは大歓迎です。

4

1 に答える 1

2

filterではなく Comparator を実装したことに注意することが最初に重要です。本当にフィルターが必要な場合は、 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 クラスパスに追加する必要があります。

于 2012-09-20T21:26:45.303 に答える