2011-10-25 55 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来得到它。