3

状況は次のとおりです。基本的には、Writable インターフェースを実装する java.util.Set のラッパーである SetWritable クラスを作成しました。1 つの列ファミリーと 1 つの列を持つ HBase テーブルがあり、その列の値はシリアル化された SetWritable オブジェクトです。今、要素をセットに追加したい場合は、HBase から行をプルし、それを SetWritable にデシリアライズし、要素を追加し、SetWritable をシリアライズしてから、HBase にプッシュする必要があります。したがって、これは、マッパーと HBase の間で非常に多くの通信が行われることを意味します。大規模なデータセットを扱っているので、パフォーマンスが低下する可能性があります。

私がやりたいことは、新しい要素を HBase に送信し、HBase サーバー上に SetWritable を逆シリアル化し、要素を追加し、SetWritable をシリアル化し、コミットするコードを配置することです。これは可能ですか?コプロセッサーは役に立ちますか?

別のアイデア: セットを 1 つの列にシリアル化する代わりに、セットの既知の要素ごとに列を作成できます。1 つの欠点 : 数十万 (または数百万) の列になる可能性があります。これは問題ですか?

4

1 に答える 1

6

シリアル化は、ローカルでもリモートでも、正しい方法ではありません。列修飾子を使用して値を保存すると、必要な動作が正確に得られます。

列修飾子をセット要素として使用すると、hbase はセットをまばらに格納できます。つまり、1 つのセットに 100 万の要素を含めることができます。ばらばらの要素を持つ別のセット。HBase は 200 万個のアイテムしか格納できません。

セット要素を追加または削除するのは簡単です。追加は put(key, column, column qualifier) で、削除は delete (key, column, column qualifier) です。セット全体を取得するには、行の値を反復するだけです。

バイナリ メンバーシップの代わりにカウントを使用するようにこのアプローチを変更することはそれほど難しくありません。アトミック インクリメント命令を使用するだけです: http://hbase.apache.org/apidocs/org/apache/hadoop/hbase/client/HTable .html#increment%28org.apache.hadoop.hbase.client.Increment%29

于 2012-05-02T23:35:41.393 に答える