2012-06-18 31 views
3

我有一个5节点的HBase集群,主要具有获取顺序数据的输入请求。通过分割区域实现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, 

即,分割后,没有连续的区域去同一个服务器来控制同一台服务器上的负载。

+0

是什么让你觉得这是造成问题?负载平衡器默认每5分钟运行一次,并移动/分割区域以平衡群集负载。这应该够了。然后由HDFS处理群集之间的分配。 –

+0

感谢Raze2dust的回复。 在同一区域服务器上连续区域的唯一问题是 - 请求连续数据时,需要更多时间,因为它超过了base.regionserver.handler.count和某些请求的限制进入等待状态。 –

+0

只为例如: 默认负载均衡后,我们注意到区域的分布是喜欢 - R-1上S4, R-2上S1, R-3上S1, R-4上S2, R- S5上S2, r-6在S2上, r-7在S3上, r-8上s5,..现在每个区域的请求数/秒数几乎相同。 但是获取位于区域r-4到r-6之间的数据的新请求完全仅取决于单个服务器S-2。 如何控制区域分布,使得没有连续的区域进入同一台服务器。 谢谢 –

回答

0

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

此外,即使连续的区域最终由相同的RS服务,您也应该能够使用多线程更快地获取数据。 HBase已经在内部为每个区域AFAIK运行一个单独的线程。通常,它不会导致太多的负载。你有没有看到由此造成的实际负荷过重?你有没有做任何分析,看看是什么造成的负载?

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

+0

谢谢Raze2dust,我会尽力的。 是的,我看到在运行协处理器时单个区域服务器上的负载也增加了heap-size以及region-server-handler-count,但仍有一些请求进入等待状态。如果某些连续区域位于不同的区域服务器上,则等待时间将缩短。它发生在同一个请求触发很多次(〜100)时。 –