2011-10-25 6 views
4

私の状況は次のとおりです。私は3ノードのZooKeepersを持つ20ノードのHadoop/HBaseクラスタを持っています。私は、MapReduce経由でHBaseテーブルから他のHBaseテーブルにデータを処理しています。HBaseはどのようにしてMapReduceの新しいリージョンをクラスタ全体に配布しますか?

新しいテーブルを作成し、そのテーブルを出力シンクとして使用するようにジョブを指示すると、すべてのデータは同じリージョンサーバーに送られます。少数の地域しかない場合、これは私を驚かせることはありません。私が持っている特定のテーブルには約450のリージョンがあり、問題が発生します:これらのリージョンのほとんど(約80%)は同じリージョンサーバー上にあります。

HBaseがクラスター全体に新しい領域の割り当てをどのようにして配布するのか、この動作が正常かどうか、あるいはバグかどうか、今私は思っていました。残念ながら、私のコードのバグをどこから探し始めるべきかわかりません。

私が尋ねる理由は、これによってジョブが非常に遅くなるということです。ジョブが完全に終了したときにのみ、テーブルはクラスタ全体でバランスが取れますが、これはこの動作を説明していません。 HBaseは、作成の瞬間に新しい領域を別のサーバに分散させるべきではありませんか?

ありがとうございました!

答えて

0

これは既知の問題だと私は信じています。現在HBaseは、どのテーブルに属しているかに関係なく、クラスタ全体に領域を分散します。

は、バックグラウンドのためのHBaseブックを参照してください: http://hbase.apache.org/book/regions.arch.html

それはあなたがHBaseの古いバージョンの上にあることが考えられます。 http://comments.gmane.org/gmane.comp.java.hadoop.hbase.user/19155

http://comments.gmane.org/gmane.comp.java.hadoop.hbase.user/12549を移動する負荷分散と地域の議論については、以下を参照してください。

+0

ありがとう、今私はなぜこのように起こるのか分かります。私のクラスタはClouderaのCDH3にあり、HBaseは0.90.4です。あなたのコメントから、私はクラスターに161台のテーブルがあることが問題になるかもしれないと考えましたか? – bwacx

+0

その問題はhbaseがテーブルを均等に分散する必要があることを認識していない点です。テーブルが1つしかない場合、これは起こりにくいですが、すべてのユーザーに少数のテーブルしか持たないようにするのは妥当ではありません。 – David

0

デフォルトでは、テイクテーブルなしで各RSの領域のバランスを調整するだけです。

hbase.master.loadbalance.bytableを取得することができます。

関連する問題