2011-10-25 53 views
4

我的情況如下:我有一個包含3個ZooKeeper的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沒有意識到表需要均勻分佈,因爲它只分配區域。如果你只有一張桌子,這不太可能發生,但強制所有用戶只有少量桌子是不合理的。 – David

0

默認情況下,它只是平衡每個RS上的區域而不考慮表格。

你可以設置hbase.master.loadbalance.bytable來得到它。