私の状況は次のとおりです。私は3ノードのZooKeepersを持つ20ノードのHadoop/HBaseクラスタを持っています。私は、MapReduce経由でHBaseテーブルから他のHBaseテーブルにデータを処理しています。HBaseはどのようにしてMapReduceの新しいリージョンをクラスタ全体に配布しますか?
新しいテーブルを作成し、そのテーブルを出力シンクとして使用するようにジョブを指示すると、すべてのデータは同じリージョンサーバーに送られます。少数の地域しかない場合、これは私を驚かせることはありません。私が持っている特定のテーブルには約450のリージョンがあり、問題が発生します:これらのリージョンのほとんど(約80%)は同じリージョンサーバー上にあります。
HBaseがクラスター全体に新しい領域の割り当てをどのようにして配布するのか、この動作が正常かどうか、あるいはバグかどうか、今私は思っていました。残念ながら、私のコードのバグをどこから探し始めるべきかわかりません。
私が尋ねる理由は、これによってジョブが非常に遅くなるということです。ジョブが完全に終了したときにのみ、テーブルはクラスタ全体でバランスが取れますが、これはこの動作を説明していません。 HBaseは、作成の瞬間に新しい領域を別のサーバに分散させるべきではありませんか?
ありがとうございました!
ありがとう、今私はなぜこのように起こるのか分かります。私のクラスタはClouderaのCDH3にあり、HBaseは0.90.4です。あなたのコメントから、私はクラスターに161台のテーブルがあることが問題になるかもしれないと考えましたか? – bwacx
その問題はhbaseがテーブルを均等に分散する必要があることを認識していない点です。テーブルが1つしかない場合、これは起こりにくいですが、すべてのユーザーに少数のテーブルしか持たないようにするのは妥当ではありません。 – David