通过拆分区域来实现HBase负载平衡

时间:2012-06-18 05:13:13

标签: java hadoop hbase

我有一个5节点的HBase集群,并且主要有输入请求来获取顺序数据。

为了优化存储,我在高负载区域上运行手动区域分割,但它没有进行太多优化,因为它分割区域但主要在同一区域服务器上。

如何以这种方式控制区域分割

r-1(k1 to k2) on server s1,
r-2(k2 to k3) on server s2,
r-3(k3 to k4) on server s3,
r-4(k4 to k5) on server s4,
r-5(k5 to k6) on server s5,
r-6(k6 to k7) on server s1,

即,在拆分后,没有连续的区域进入同一台服务器来控制同一服务器上的负载。

1 个答案:

答案 0 :(得分:0)

我假设服务器是指RegionServer。这些区域是随机分配的区域服务器,因此如果您的集群足够大,则不应发生这种情况(或者应该很少发生)。这个想法是你不应该为此烦恼。另外,要了解regionserver只是数据的网关。它依靠HDFS来获取实际数据,数据来自何处,由HDFS决定。

此外,即使连续的区域最终由同一个RS服务,您也应该能够使用多线程来更快地获取数据。 HBase已经在内部为每个区域AFAIK运行一个单独的线程。通常,它不会导致过多的负载。你有没有看到由此引起的负载过大?您是否进行了任何分析以查看导致负载的原因?

因此,确实没有必要这样做,但在特殊情况下,您可以使用HBaseAdmin.move方法来实现此目的。您可以使用HTable.getRegionLocations()编写一些代码来遍历表的所有区域,按照开始键对区域进行排序,然后手动(using HBaseAdmin.move())确保所有连续区域位于不同的区域服务器上。但我强烈怀疑这实际上是一个问题,我建议你在采用这种方法之前确认这一点。