いくつかの 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 ソース コードを調べて何が問題なのかを理解しようとしたりしても、重要な結果は得られませんでした。フィルタをスキャン オブジェクトに挿入しなければ、すべて正常に動作します。
誰かが何が間違っているかを知っていたり、似たようなことをしたことがあるなら、あなたの助けは大歓迎です。