我有一个 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,
即拆分后,没有连续的region去同一台服务器控制同一台服务器上的负载。
最佳答案
我假设服务器是指 RegionServer。区域是随机分配的区域服务器,所以如果你的集群足够大,这种情况应该不会发生(或者应该很少发生)。这个想法是你不应该为此烦恼。另外,请了解区域服务器只是数据的网关。它依赖于 HDFS 来获取实际数据,而数据来自哪里,由 HDFS 决定。
此外,即使连续区域最终由同一个 RS 提供服务,您也应该能够使用多线程来更快地获取数据。 HBase 已经在内部为每个区域 AFAIK 运行一个单独的线程。通常,它不会导致过多的负载。您是否看到由于这个原因实际上负载过大?您是否进行了任何分析以查看导致负载的原因?
因此,确实没有必要这样做,但在特殊情况下,您可以使用 HBaseAdmin.move
实现这一目标的方法。您可以使用 HTable.getRegionLocations()
编写一些代码来遍历表的所有区域,根据开始键对区域进行排序并手动(使用 HBaseAdmin.move()
)确保所有连续的区域都在单独的区域服务器上。但我强烈怀疑这实际上是一个问题,我建议您在采用这种方法之前确认这一点。
关于java - HBase 分区域负载均衡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11077228/